nosql:redis_overview
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |||
nosql:redis_overview [2016/12/06 16:44] – [Mit Python an der Redis DB anmelden] gpipperr | 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 " | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | |||
+ | Redis ist bereits sei 2009 von Salvatore Sanfilippo und mittlerweise in der Version 3.3.5 (Dezember 2016) verfügbar. | ||
+ | |||
+ | |||
+ | Grundaufbau: | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | |||
+ | |||
+ | 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: | ||
+ | |||
+ | 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:// | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | |||
+ | ====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. | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | < | ||
+ | |||
+ | Mit "set KEY value" ein Key => String Paar definieren | ||
+ | |||
+ | SET | ||
+ | Beispiel: | ||
+ | <code redis> | ||
+ | set barcode: | ||
+ | set barcode: | ||
+ | set barcode: | ||
+ | set barcode: | ||
+ | |||
+ | keys barcode:* | ||
+ | |||
+ | 1) " | ||
+ | 2) " | ||
+ | 3) " | ||
+ | 4) " | ||
+ | 5) " | ||
+ | |||
+ | |||
+ | get barcode: | ||
+ | " | ||
+ | |||
+ | mget barcode: | ||
+ | 1) " | ||
+ | 2) " | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===Hash mit key Value Paaren=== | ||
+ | |||
+ | Ein Hashwert identifiziert eine Menge von Key Value Paaren. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | < | ||
+ | |||
+ | HMSET / HVALS: | ||
+ | <code redis> | ||
+ | |||
+ | hmset barcodes: | ||
+ | hmset barcodes: | ||
+ | hmset barcodes: | ||
+ | hmset barcodes: | ||
+ | |||
+ | # | ||
+ | |||
+ | hkeys barcodes: | ||
+ | 1) " | ||
+ | 2) " | ||
+ | 3) " | ||
+ | |||
+ | # Werte | ||
+ | hvals barcodes: | ||
+ | 1) " | ||
+ | 2) " | ||
+ | 3) " | ||
+ | |||
+ | #den Wert von genau einem Feld | ||
+ | | ||
+ | " | ||
+ | |||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ===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. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | |||
+ | RPUSCH | ||
+ | <code bash> | ||
+ | RPUSH GPI: | ||
+ | RPUSH GPI: | ||
+ | RPUSH GPI: | ||
+ | |||
+ | LLEN GPI: | ||
+ | (integer) 4 | ||
+ | |||
+ | LRANGE GPI: | ||
+ | 1) " | ||
+ | 2) " | ||
+ | 3) " | ||
+ | 4) " | ||
+ | |||
+ | #Element von der Liste entfernen | ||
+ | LPOP GPI: | ||
+ | " | ||
+ | |||
+ | LRANGE GPI: | ||
+ | 1) " | ||
+ | 2) " | ||
+ | 3) " | ||
+ | |||
+ | # Wert vom Ende einer Liste entfernen und am Anfang einer anderen Liste wieder einfügen | ||
+ | |||
+ | # element anlegen | ||
+ | | ||
+ | # letztes element an den Anfang der zweiten Liste legen | ||
+ | # Quell LISTE zu Ziel Liste | ||
+ | |||
+ | RPOPLPUSH SIE: | ||
+ | |||
+ | </ | ||
+ | |||
+ | === SET === | ||
+ | |||
+ | |||
+ | Mit einem Set läßt sich eine Liste abbilden | ||
+ | |||
+ | == Unsortiert == | ||
+ | <code redis> | ||
+ | |||
+ | sadd barcodes: | ||
+ | |||
+ | sadd barcodes: | ||
+ | |||
+ | |||
+ | SMEMBERS barcodes: | ||
+ | 1) " | ||
+ | 2) " | ||
+ | 3) " | ||
+ | 4) " | ||
+ | 5) " | ||
+ | |||
+ | #Zeige das Element das in beiden Mengen vorkommt | ||
+ | |||
+ | sinter barcodes: | ||
+ | 1) " | ||
+ | |||
+ | #Differenz zwischen den Mengen | ||
+ | |||
+ | sdiff barcodes: | ||
+ | 1) " | ||
+ | 2) " | ||
+ | 3) " | ||
+ | 4) " | ||
+ | |||
+ | |||
+ | # Union | ||
+ | SUNION barcodes: | ||
+ | 1) " | ||
+ | 2) " | ||
+ | 3) " | ||
+ | 4) " | ||
+ | 5) " | ||
+ | 6) " | ||
+ | 7) " | ||
+ | 8) " | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | == Sortiert == | ||
+ | |||
+ | |||
+ | Liste mit einem SCore Wert pro Element | ||
+ | |||
+ | ZADD key [NX|XX] [CH] [INCR] score member [score member ...]: | ||
+ | |||
+ | <code redis> | ||
+ | zadd barcode: | ||
+ | |||
+ | # alle mit diesem Score | ||
+ | zcount barcode: | ||
+ | (integer) 4 | ||
+ | |||
+ | # Wer liegt an welcher Stelle | ||
+ | zrevrank barcode: | ||
+ | (integer) 4 | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===Eine einfaches Quing mit blockierenen Listen === | ||
+ | |||
+ | ein einfache Queing dann mit einer blockierenen Liste erreicht werden, einen Client öffnen und mit "BRPOP < | ||
+ | diese Liste schreiben "LPUSh < | ||
+ | |||
+ | |||
+ | |||
+ | ==== 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: | ||
+ | |||
+ | |||
+ | hset barcode: | ||
+ | |||
+ | # hole den barcode für dieses Modell | ||
+ | |||
+ | hget barcode: | ||
+ | |||
+ | " | ||
+ | </ | ||
+ | Funktioniert nur mit unique Werten für den " | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | |||
+ | ===== Betrieb ===== | ||
+ | |||
+ | Wie lässt sich das System nun in Betrieb nehmen? | ||
+ | |||
+ | |||
+ | ==== Installation ==== | ||
+ | |||
+ | |||
+ | Linux Basis System wie => Linux 7 | ||
+ | |||
+ | Vorbereitung: | ||
+ | <code bash> | ||
+ | yum install gcc | ||
+ | </ | ||
+ | |||
+ | als User root: | ||
+ | <code bash> | ||
+ | |||
+ | mkdir /srv/redis | ||
+ | |||
+ | cd /srv/redis | ||
+ | |||
+ | wget http:// | ||
+ | |||
+ | 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 | ||
+ | |||
+ | </ | ||
+ | |||
+ | Verzeichnis für DB Snapshots anlegen: | ||
+ | <code bash> | ||
+ | mkdir / | ||
+ | |||
+ | </ | ||
+ | |||
+ | Konfiguraton anpassen/ | ||
+ | |||
+ | <code bash> | ||
+ | |||
+ | cp / | ||
+ | |||
+ | #Datenbank Verzeichnis für Snapshots angeben | ||
+ | |||
+ | .. | ||
+ | # Note that you must specify a directory here, not a file name. | ||
+ | |||
+ | dir / | ||
+ | |||
+ | .. | ||
+ | |||
+ | </ | ||
+ | |||
+ | TCP Settings bei Bedarf für hohe Last anpassen: | ||
+ | |||
+ | <code bash> | ||
+ | cat / | ||
+ | |||
+ | vi / | ||
+ | |||
+ | #Redis High Performance Settings | ||
+ | net.core.somaxconn=1024 | ||
+ | net.ipv4.tcp_max_syn_backlog=1024 | ||
+ | vm.overcommit_memory = 1 | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ==== Start ==== | ||
+ | |||
+ | Erster Start mit: | ||
+ | |||
+ | Noch als root: | ||
+ | <code bash> | ||
+ | redis-server / | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ==== Mit dem Redis Client an der DB anmelden === | ||
+ | |||
+ | |||
+ | <code bash> | ||
+ | |||
+ | redis-cli | ||
+ | |||
+ | 127.0.0.1: | ||
+ | PONG | ||
+ | |||
+ | </ | ||
+ | |||
+ | Konfiguration auslesen mit CONFIG: | ||
+ | |||
+ | <code redis> | ||
+ | config get * | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ==== 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: | ||
+ | </ | ||
+ | |||
+ | siehe https:// | ||
+ | |||
+ | Ein erster Test: | ||
+ | |||
+ | <code python> | ||
+ | PS C: | ||
+ | Python 3.4.4 (v3.4.4: | ||
+ | Type " | ||
+ | >>> | ||
+ | |||
+ | >>> | ||
+ | |||
+ | >>> | ||
+ | True | ||
+ | |||
+ | >>> | ||
+ | ' | ||
+ | |||
+ | </ | ||
+ | |||
+ | Damit das hier klappt, muss natürlich zuvor das Binding auf die gewünschte IP Adresse erfolgen und die Securtiy ausgeschaltet werden. | ||
+ | <fc # | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ==== Online Log Modus einschalten ==== | ||
+ | |||
+ | siehe https:// | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Quellen ==== | ||
+ | |||
+ | |||
+ | * https:// |
nosql/redis_overview.txt · Zuletzt geändert: 2017/01/04 21:37 von gpipperr