[[Vorlage(getestet, jammy)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Terminal:Einen Terminal öffnen] [:Programme_kompilieren:Ein Programm kompilieren] }}} [[Inhaltsverzeichnis(2)]] [[Bild(redis_logo.png,align=left)]] [http://redis.io Redis] {en} ist ein „Key-Value Store“ (oder kurz nur KV Store), ins Deutsche übersetzt „Schlüssel-Werte-Datenbank“. Hier werden die Daten immer in Form von Schlüssel-Werte-Paaren gespeichert. Man kann sich die Datenbank also so vorstellen, dass darin nur eine Tabelle mit zwei Spalten existiert, nämlich einer Spalte für den Schlüssel und einer für den Wert. Da Redis aber verschiedene [#Datentypen Datentypen] für die Werte kennt, bezeichnen die Entwickler die Datenbank aber bevorzugt als "data structure store". Im Vergleich zu anderen Datenbanken wie z.B. [:MySQL:], [:PostgreSQL:] oder [:CouchDB:] ist Redis extrem schnell. Selbst auf halbwegs aktuellen Desktop-Rechner schafft die Datenbank über 100.000 (einfache) Schreibvorgänge und über 80.000 (einfache) Lesevorgänge pro Sekunde. Dies liegt primär auch daran, dass die Datenbank komplett im RAM gehalten wird und nur nach einer bestimmten Zeit oder einer bestimmten Anzahl geänderter Werte auf die Festplatte geschrieben wird. Des Weiteren beherrscht Redis [#Replikation Replikation] und ist seit der Version 3.0 auch [#Redis-Cluster Cluster-fähig]. Redis ist als Server-Client-Architektur ausgelegt, d.h. der Redis-Server läuft als Dienst (im Hintergrund) und kann dann per Client abgefragt werden. Weiterhin ist bei der Redis-Installation auch eine Kommandozeile enthalten, über welche sich der volle Funktionsumfang des Servers nutzen lässt. Wichtig ist auch noch, dass bei Redis Schlüssel „alles“ sind und Werte „nichts“. D.h. alle Abfragen beziehen sich immer auf einen Schlüssel und liefern einen Wert zurück. Abfrage zu Werten gibt es nicht - Befehle wie z.B. "Zeige mir den Schlüssel zum Wert foobar" gibt es nicht. Seit Version 0.10 benutzt auch [https://ubuntuusers.de/inyoka/ Inyoka] (die Software, auf der auch dieses Wiki von ubuntuusers.de läuft) Redis als Datenspeicher, zusätzlich zu MySQL. = Installation = == Paketquellen == Redis befindet sich in den Paketquellen von Ubuntu und kann über das Paket {{{#!vorlage Paketinstallation redis-server,universe }}} installiert werden - allerdings in alten (veralteten) Versionen. Von daher sollte einer der folgenden Installationswege bevorzugt gewählt werden. == als snap == Die Redisentwickler stellen die aktuelle Version von Redis als snap bereit: {{{#!vorlage Befehl snap install redis }}} == Fremdpaket und selber kompilieren == Wer Redis nicht aus den Paketquellen oder als snap installieren möchte, der finden auf der Seite [https://redis.io/docs/getting-started/ Getting Started] {en} weiterführende Links, wie man Redis über eine Fremdquelle installiert oder selber manuell kompiliert[3]. = Benutzung = Bei der Installation aus den Paketquellen und als snap wird der Redis-Server automatisch gestartet. In der Standardinstallation lauscht Redis auf Port `6379` und allen Adressen. Die Einstellungen können in der [#Konfiguration Konfiguration] geändert werden. == Redis Kommandozeile == Redis bringt eine eigene, interaktive Kommandozeile mit, über die der volle Funktionsumfang der Servers verfügbar ist. Bei systemweiter Installation ruft man diese über {{{#!vorlage Befehl redis.cli }}} Eine Übersicht über alle Befehle findet man in der [http://redis.io/commands Befehlsliste] {en} von Redis. == Publish / Subscribe == Redis ist auch ein [wikipedia_en:Publish%E2%80%93subscribe_pattern:Publish-Subscribe Server]. Hier können Nachrichten an Kanäle gesendet werden ("Publish"), auf dem Empfänger dann lauschen können ("subscribe"). Wie dies bei Redis umgesetzt ist, kann in der offiziellen [http://www.redis.io/topics/pubsub Dokumentation zu Pub/Sub] {en} nachgelesen werden. == Lua Skripting == Seit Version 2.6 unterstützt Redis server-seitig das Ausführen von [:Lua:]-Skripten. Damit können z.B. Daten aus der Datenbank auf dem Server ver- / bearbeitet werden, bevor sie als Ergebnis zurück geliefert werden. Weitere Informationen sind in der [http://www.redis.io/commands/eval Dokumentation] {en} zu finden. == Speicherverbrauch beim Schreiben der Datenbank optimieren == Wenn die Redis-Datenbank viele Daten enthält und somit relativ viel RAM (bezogen auf des insgesamt verfügbare RAM) belegt kann es passieren, dass beim Speichern der Datenbank auf die Festplatte der Redis-Server abstürzt, weil nicht genügten RAM verfügbar ist. Abhilfe schafft man, indem man in die Datei '''/etc/sysctl.conf''' die Zeile {{{ vm.overcommit_memory=1 }}} einträgt. Die Hintergründe dazu sind in den [http://redis.io/topics/faq Redis FAQs] {en} unter dem Punkt ''"Background saving is failing with a fork() error under Linux even if I've a lot of free RAM!"'' erklärt und auch im [http://redis.io/topics/admin Redis Administration Guide] {en}. == Benchmark aufrufen == Bei der Installation wird direkt auch ein Benchmark-Programm mit installiert. Bei systemweiter Installation kann man dies über {{{#!vorlage Befehl redis.benchmark }}} aufrufen. = Datentypen = Redis kennt aktuell neun verschiedenen Datentypen: {{{#!vorlage Tabelle <-2 rowclass="titel">Redis Datentypen +++ Datentyp Beschreibung +++ String Eine beliebige Zeichenfolge (z.B. Text) +++ List Entspricht einem [wikipedia:Feld_(Datentyp):Array], die Elemente (=Strings) werden über einen positiven, ganzzahligen, null-basierten Index angesprochen (d.h. das erste Element der Liste hat den Index 0, das zweite 1 usw.). +++ Hash Entspricht einem [wikipedia:Assoziatives_Datenfeld:assoziativem Array], die Elemente bestehen hier wiederum aus Schlüssel-Werten Paaren. +++ Set Entspricht „List", ausser dass - eben im Gegensatz zu List - Elemente nur genau einmal vorkommen dürfen. +++ Sorted Set Entspricht einem Set, nur dass zusätzlich der Index des Elements explizit mit angegeben wird. +++ Bitmaps eine spezielle Version des Datentyps "String", bei dem nur Nullen und Einsen, eben Bits, gespeichert werden +++ HyperLogLogs probabilistische Datenstruktur, mit der sich die [wikipedia:M%C3%A4chtigkeit_%28Mathematik%29:Kardinalität] einer Datenmenge sehr speichereffizient bestimmen lässt +++ Geodaten Varianten des Sortes Sets, bei dem Geodaten in der Form "LATITUDE, LONGITUDE, ORT" angegeben werden. LATITUDE und LONGITUDE müssen in Dezimalgrad angegeben werden. Damit ist es z.B. möglich Abstände zwischen zwei Orten zu berechnen oder eine Umkreissuche durchzuführen. +++ Streams Streams in Redis sind eine Art Datenstrom in Form eines Logs, an den nur Daten angehangen werden können, d.h. bestehende Daten können nicht geändert oder gelöscht werden. Weiterführende Infos zu Streams sind in der [https://redis.io/docs/manual/data-types/streams/ Dokumentation] {en} zu finden. }}} Für die Datenbank sind alle Werte einfach nur eine folge von Bytes, d.h. es gibt keine Unterscheidung, ob Textstrings oder binäre Daten gespeichert werden. Eine ausführlichere Erläuterung der Datentype findet man auf der Seite [http://redis.io/topics/data-types Data Types] {en}. Redis unterstützt übrigens nicht die Verschachtelung von Datentypen. Ein Set kann z.B. nur aus Strings bestehen, nicht aber aus Listen, Hashs etc. = Konfiguration = Redis kann konfiguriert werden, indem man dem Server beim Start die Datei '''redis.conf''' mitgibt, in der die Konfiguration hinterlegt ist. Je nach eingesetzter Redis-Version kann der Inhalt bzw. Umfang der Konfigurationsdateien variieren. Vorlagen für alle Redis-Versionen findet man [https://redis.io/docs/manual/config/ in der Dokumentation] {en} Eingestellt werden kann hier z.B. auf welcher IP-Adresse und auf welchem Port lauschen soll, Details zu [#Replikation Replikation], Passwortschutz für die Datenbank sowie in welchen Intervallen Redis die Daten auf Festplatte speichern soll. Weiterhin kann in der Konfigurationsdatei eingestellt werden, dass Redis im sogenannten „Append-only“-Modus betrieben werden soll. Dies bedeutet, dass Redis jede Änderung in der Datenbank direkt in eine separate Datei schreibt (nicht die Datenbank selber). Dies gewährleistet - im Vergleich zum reinen asynchronen Speichern - eine höhere Datensicherheit bei einem Absturz des System, verlangsamt die Datenbank aber auch. „Append only” und asynchrones Schreiben kann kombiniert werden, die Wege schliessen sich nicht aus. Nach einem Absturz wird die Datenbank aus der Datei '''appendonly.log''' rekonstruiert, so dass in der Regel kein Schreibvorgang verloren sein sollte. Um die Datei '''appendonly.log''' nicht zu gross werden zu lassen, sollte in regelmässigen Abständen der Befehl `bgwriteaof` ausgeführt werden. == Replikation == Redis beherrscht Ein-Weg-Replikation („Master-Slave-Replikation“) mit Bordmitteln. Innerhalb der zuvor beschriebenen Konfigurationsdatei kann im Abschnitt ''"Replication"'' festgelegt werden, ob der Redis-Server einem anderen Server, dessen IP-Adressen und Port anzugeben ist, folgen soll. D.h. alle Änderungen dieses Redis-Server („Master”) werden auf den lokalen Redis-Server „Slave“ repliziert. == Redis-Cluster == Seit der Version 3.0 ist Redis cluster-fähig, wobei für eine Redis-Cluster mindestens drei Redis-Server benötigt werden. Der Redis-Cluster nutzt dabei Hash-Slots und jeder Server innerhalb des Clusters ist für die Speicherung eines Teils der Hash-Slots zuständig. Eine ausführliche Einführung in Redis-Cluster inklusive weiterführender Links ist in der Dokumentation auf der Seite [http://www.redis.io/topics/cluster-tutorial Redis Cluster-Tutorial] {en} zu finden. = Links = * [http://redis.io/documentation Die Dokumentation] {en} von Redis, welche viele Beispiele und Tipps enthält * [http://redis.io/topics/twitter-clone Beispielanwendung] {en} - es wird ein kleiner Twitter-Clone mit Redis als Datenbank „entwickelt“. Absolut lesenswert, da hier eine sehr gute Einführungen in die Strukturierungen des Datenbank-Schemas eines Key Value Stores gegeben wird. * [http://openmymind.net/2012/1/23/The-Little-Redis-Book/ The Little Redis Book] {en} - freies, kurzes "Buch" zu Redis, welches einen sehr gute und kompakte Einführung bietet * [http://try.redis-db.com/ Live-Version] {en} von Redis online ausprobieren * [http://www.freiesmagazin.de/mobil/freiesMagazin-2012-09.html#12_09_redis Artikel in freiesMagazin] {de}, welcher eine Einführung mit vielen Beispielen in die Datentypen von Redis gibt #tag: Server, Programmierung, Datenbank, Key-Value Store