Benutzer-Werkzeuge

Webseiten-Werkzeuge


nosql:redis_overview

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
nosql:redis_overview [2016/12/06 16:44]
gpipperr [Mit Python an der Redis DB anmelden]
nosql:redis_overview [2017/01/04 21:37] (aktuell)
gpipperr
Zeile 1: Zeile 1:
 +===== Redis - REmote Directory Service - Ein InMemory Key Value Store =====
  
 +**Aufgaben:**
 +
 +Im aktuellen Projekt soll eine Redis Datenbank als eine Art "Queue" für sehr schnelle Anfragen für eine Mobil App dienen.
 +
 +
 +{{ :nosql:redis:redis_lampda_architecture_v01.png | Redis as speed layer in a lampda architecture }}
 +
 +
 +Redis ist bereits sei 2009 von Salvatore Sanfilippo und mittlerweise in der Version 3.3.5 (Dezember 2016) verfügbar.
 +
 +
 +Grundaufbau:
 +
 +{{ :nosql:redis:redis_overview_v01.png?600 | Redis Oberview }}
 +
 +
 +
 +Redis ist im Prinzip ein Key Value InMemory Data Store, d.h. die ideale Komponente für den Speed Layer einer Lampda Architektur.
 +
 +
 +
 +Redis ist konsequent auf Performance ausgelegt und kann mit sehr vielen Abfragen umgehen.
 +
 +Auch ein Verfallsdatum für die Daten bereits beim Einfügen definiert werden, um zu verhindern das der "Cache Layer" überläuft. Damit lässt sich ein Round Robin Verfahren für die Daten sehr einfach implementieren.
 +
 +
 +==Abgrenzung zur Oracle NoSQL DB===
 +
 +
 +Die Oracle NoSQL DB ist ideal für die verteilte Datenhaltung in einem Cluster Konstrukt, auch für sehr große Datenmengen.
 +(siehe => [[nosql:oracle_nosql_database_einfuehrung|Die Oracle NoSQL Database - Ein Key Value Store]])
 +
 +Die Oracle NoSQL DB ist in Java entwickelt und baut auf die Clusterfähigkeit der Berkely Java DB auf, d.h, die Datenhaltung ist der klare Fokus dieser Datenbank.
 +
 +Im Gegensatz dazu ist Redis mit der InMemory Struktur ideal für sehr schnelles Einfügung und Abfragen. 
 +
 +Der Speicherinhalt kann zwar auch persistiet werden, aber darin sehe ich zur Zeit nicht den Fokus diese Datenbank Lösung. Dieses schreiben auf Platte dient mehr dazu, im Fehlerfall schneller (bzw. überhaupt wieder) den Inhalt der DB im Speicher zu rekonstruieren.
 +
 +In unseren Fall mit unserer Lampda Architektur schreiben wir ja parallel beim Hinzufügen der Daten in den Speed Layer mit der Redis DB und gleich zeit mehr transactional traditionell in eine relationale Datenbank wie [[https://www.postgresql.org/|PostgreSQL]] oder eben auch eine Oracle.
 +
 +
 +----
 +
 +
 +
 +====Was können wir mit der Redis DB erreichen====
 +
 +===Key => Value===
 +
 +Ein Schlüssel zeigt auf ein Objekt wie einem String oder einen Integer Wert.
 +
 +
 +{{ :nosql:redis:redis_key_value_v01.png | Redis key value store}}
 +
 +<KEY>|<Value>
 +
 +Mit "set KEY value" ein Key => String Paar definieren
 +
 +SET
 +Beispiel:
 +<code redis>
 +set barcode:X89F894 '{"hersteller" : "GPI","Modell" : "TERM1",  "Baujahr" : "2015"}'
 +set barcode:X89F895 '{"hersteller" : "GPI","Modell" : "P23",    "Baujahr" : "2016"}'
 +set barcode:X89F896 '{"hersteller" : "GPI","Modell" : "RED24",  "Baujahr" : "2013"}'
 +set barcode:X89F899 '{"hersteller" : "GPI","Modell" : "DE5678", "Baujahr" : "2011"}'
 +
 +keys barcode:*
 +
 +1) "barcode:X89F899"
 +2) "barcode:X89F895"
 +3) "barcode:X89F894"
 +4) "barcode:X89F896"
 +5) "barcode:896777"
 +
 +
 +get barcode:X89F899
 +"{\"hersteller\" : \"GPI\",\"Modell\" : \"DE5678\", \"Baujahr\" : \"2011\"}"
 +
 +mget barcode:X89F899 barcode:896777
 +1) "{\"hersteller\" : \"GPI\",\"Modell\" : \"DE5678\", \"Baujahr\" : \"2011\"}"
 +2) "{\"hersteller\":\"GPI\",\"Modell\":\"P24\",\"Baujahr\":\"2016\"}"
 + 
 +</code>
 +
 +===Hash mit key Value Paaren===
 +
 +Ein Hashwert identifiziert eine Menge von Key Value Paaren.
 +
 +{{ :nosql:redis:redis_hash_values_v01.png | Redis Hash Values }}
 +
 +<HASH> <FELD> <WERT> | <FELD> <WERT>  | <FELD> <WERT>  ...
 +
 +HMSET / HVALS:
 +<code redis>
 +
 +hmset barcodes:X89F894 hersteller "GPI" modell "TERM1"   baujahr "2015"
 +hmset barcodes:X89F895 hersteller "GPI" modell "P23"     baujahr "2016"
 +hmset barcodes:X89F896 hersteller "GPI" modell "RED24"   baujahr "2013"
 +hmset barcodes:X89F899 hersteller "GPI" modell "DE5678"  baujahr "2011"
 +
 +#Felder 
 +
 +hkeys barcodes:X89F899
 +1) "hersteller"
 +2) "modell"
 +3) "baujahr"
 +
 +# Werte 
 +hvals barcodes:X89F899
 +1) "GPI"
 +2) "DE5678"
 +3) "2011"
 +
 +#den Wert von genau einem Feld 
 + hget  barcodes:X89F899 hersteller
 +"GPI"
 +
 +
 +
 +</code>
 +
 +
 +===Liste von Werten ===
 +
 +Ein Schlüssel identifiziert eine Liste von werten, es kann das letzte Element der Liste gelöscht oder in eine neue Liste an den Anfang geschoben werden.
 +
 +{{ :nosql:redis:redis_list_v01.png | Redis list of values}}
 +
 +
 +RPUSCH
 +<code bash>
 +RPUSH GPI:barcodes X89F894 X89F895
 +RPUSH GPI:barcodes X89F896
 +RPUSH GPI:barcodes X89F899
 +
 +LLEN  GPI:barcodes
 +(integer) 4
 +
 +LRANGE GPI:barcodes  0 4
 +1) "X89F894"
 +2) "X89F895"
 +3) "X89F896"
 +4) "X89F899"
 +
 +#Element von der Liste entfernen
 +LPOP GPI:barcodes
 +"X89F894"
 +
 +LRANGE GPI:barcodes  0 4
 +1) "X89F895"
 +2) "X89F896"
 +3) "X89F899"
 +
 +# Wert vom Ende einer Liste entfernen und am Anfang einer anderen Liste wieder einfügen
 +
 +# element anlegen
 + RPUSH  SIE:barcodes X89F894
 +# letztes element an den Anfang der zweiten Liste legen
 +# Quell LISTE zu  Ziel Liste
 +
 +RPOPLPUSH SIE:barcodes GPI:barcodes
 +
 +</code>
 +
 +=== SET ===
 +
 +
 +Mit einem Set läßt sich eine Liste abbilden
 +
 +== Unsortiert ==
 +<code redis>
 +
 +sadd barcodes:gpi  X89F894 X89F895 X89F896 X89F899
 +
 +sadd barcodes:sim Z78AB453 Z78AB456 Z78AB478 X89F899
 +
 +
 +SMEMBERS barcodes:sim
 +1) "Z78AB453"
 +2) "Z78AB445"
 +3) "Z78AB478"
 +4) "Z78AB456"
 +5) "X89F899"
 +
 +#Zeige das Element das in beiden Mengen vorkommt
 +
 +sinter barcodes:sim barcodes:gpi
 +1) "X89F899"
 +
 +#Differenz zwischen den Mengen 
 +
 +sdiff barcodes:sim  barcodes:gpi
 +1) "Z78AB456"
 +2) "Z78AB445"
 +3) "Z78AB453"
 +4) "Z78AB478"
 +
 +
 +# Union
 +SUNION barcodes:sim  barcodes:gpi
 +1) "X89F894"
 +2) "Z78AB453"
 +3) "Z78AB445"
 +4) "Z78AB478"
 +5) "X89F895"
 +6) "Z78AB456"
 +7) "X89F896"
 +8) "X89F899"
 +
 +
 +
 +
 +</code>
 +
 +== Sortiert ==
 +
 +
 +Liste mit einem SCore Wert pro Element
 + 
 + ZADD key [NX|XX] [CH] [INCR] score member [score member ...]: 
 +
 +<code redis>
 +zadd barcode:usage 10 "X89F895" 899 "X89F896" 100 "X89F899" 400 "X89F894"
 +
 +# alle mit diesem Score
 +zcount barcode:usage  0 1000
 +(integer) 4
 +
 +# Wer liegt an welcher Stelle
 +zrevrank barcode:usage X89F895
 +(integer) 4
 +
 +</code>
 +
 +
 +
 +===Eine einfaches Quing mit blockierenen Listen ===
 +
 +ein einfache Queing dann mit einer blockierenen Liste erreicht werden, einen Client öffnen und mit "BRPOP <listename> <zeit>" eine Liste "abonnieren", zweiten Client öffnen und dort in 
 +diese Liste schreiben "LPUSh <listenname> "<wert>".
 +
 +
 +
 +==== Komplexere Aufgaben====
 +
 +=== Json indizieren ? ===
 +
 +Eine Direkte Indizierung eines Wert des Key Value Paares ist nicht möglich, die Daten merfach unterschiedlich anzugelegen ist aber eher ungeschikt.
 +
 +Eine Lösung kann sein mit einem entsprechenden Hash zu auf das zu indizierende element zu arbeiten.
 +
 +Daten:
 +
 +<code redis>
 +
 +set barcode:X89F894 '{"hersteller" : "GPI","Modell" : "TERM1",  "Baujahr" : "2015"}'
 +
 +
 +hset barcode:index:modell TERM1 X89F894
 +
 +# hole den barcode für dieses Modell
 +
 +hget barcode:index:modell TERM1
 +
 +"X89F894"
 +</code>
 +Funktioniert nur mit unique Werten für den "pseudo" Index!
 +
 +
 +----
 +
 +----
 +
 +
 +
 +===== Betrieb =====
 +
 +Wie lässt sich das System nun in Betrieb nehmen?
 +
 +
 +==== Installation ====
 +
 +
 +Linux Basis System wie => Linux 7
 +
 +Vorbereitung:
 +<code bash>
 +yum install gcc
 +</code>
 +
 +als User root:
 +<code bash>
 +
 +mkdir /srv/redis
 +
 +cd /srv/redis
 +
 +wget http://download.redis.io/releases/redis-3.2.5.tar.gz
 +
 +tar -xvfz redis-3.2.5.tar.gz
 +
 +cd redis-3.2.5
 +
 +make
 +
 +
 +make install
 +
 +#Bei Fehler erst ein clean vor dem nächste Versuch
 +#hatte am Anfang gcc nicht mit installiert
 +make distclean  
 +
 +</code>
 +
 +Verzeichnis für DB Snapshots anlegen:
 +<code bash>
 +mkdir /srv/redisDB
 +
 +</code>
 +
 +Konfiguraton anpassen/erstellen:
 +
 +<code bash>
 +
 +cp /srv/redis/redis-3.2.5/redis.conf /etc/redis.conf
 +
 +#Datenbank Verzeichnis für Snapshots angeben
 +
 +..
 +# Note that you must specify a directory here, not a file name.
 +
 +dir /srv/redisDB/
 +
 +..
 +
 +</code>
 +
 +TCP Settings bei Bedarf für hohe Last anpassen:
 +
 +<code bash>
 +cat  /proc/sys/net/core/somaxconn
 +
 +vi /etc/sysctl.conf
 +
 +#Redis High Performance Settings
 +net.core.somaxconn=1024
 +net.ipv4.tcp_max_syn_backlog=1024
 +vm.overcommit_memory = 1
 +
 +</code>
 +
 +
 +----
 +
 +==== Start ====
 +
 +Erster Start mit:
 +
 +Noch als root:
 +<code bash>
 +redis-server /etc/redis.conf &
 +</code>
 +
 +
 +
 +
 +----
 +
 +==== Mit dem Redis Client an der DB anmelden ===
 +
 +
 +<code bash>
 +
 +redis-cli
 +
 +127.0.0.1:6379> ping
 +PONG
 +
 +</code>
 +
 +Konfiguration auslesen mit CONFIG:
 +
 +<code redis>
 +config get *
 +</code>
 +
 +
 +
 +----
 +
 +==== Mit Python an der Redis DB anmelden ====
 +
 +Auch unter Windows kann der Redis Client verwendet werden, sehr gut, das macht es flexibler .-).
 +
 +
 +Lib unter der Powershell von Windows mit pip installieren:
 +<code cmd>
 +PS C:\Python34> .\python -m  pip install redis
 +</code>
 +
 +siehe https://pypi.python.org/pypi/redis
 +
 +Ein erster Test:
 +
 +<code python>
 +PS C:\Python34> .\python.exe
 +Python 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 19:28:18) [MSC v.1600 32 bit (Intel)] on win32
 +Type "help", "copyright", "credits" or "license" for more information.
 +>>> import redis
 +
 +>>> conn = redis.StrictRedis(host='10.10.10.105', port=6379, db=0)
 +
 +>>> conn.set('barcode:X89675','{"hersteller" : "GPI","Modell" : "TERM1",  "Baujahr" : "2015"}')
 +True
 +
 +>>> conn.get('barcode:X89675')
 +'{"hersteller" : "GPI","Modell" : "TERM1",  "Baujahr" : "2015"}'
 +
 +</code>
 +
 +Damit das hier klappt, muss natürlich zuvor das Binding auf die gewünschte IP Adresse erfolgen und die Securtiy ausgeschaltet werden.
 +<fc #800000>Klappt dann alles nicht vergessen das System wieder zu härten!</fc>
 +
 +----
 +
 +==== Online Log Modus einschalten ====
 +
 +siehe  https://redis.io/topics/persistence
 +
 +
 +
 +----
 +
 +
 +
 +
 +==== Quellen ====
 +
 +
 +  * https://redis.io
"Autor: Gunther Pipperr"
nosql/redis_overview.txt · Zuletzt geändert: 2017/01/04 21:37 von gpipperr