Checkmark on Circle.png

Redis

Aus KGS-Wiki

Redis (REmote DIctionary Server) ist eine In-Memory-Datenbank mit einer einfachen Schlüssel-Wert-Datenstruktur (englisch key value store) und gehört zur Familie der NoSQL-Datenbanken (ist also nicht relational). Redis ist Open Source welches bedeutet, dass jeder Zugriff drauf haben kann und ihn ebenso bearbeiten kann. Redis ist der verbreitetste Schlüssel-Werte-Speicher. Der große Vorteil von Redis ist, dass es schneller ist als relationale Datenbanken wie z. B. MySQL. Jedoch eignet er sich eher weniger für komplexe Datenstrukturen. Redis wird ebenso als Cache, Message Broker und Warteschlange verwendet. Redis bietet Reaktionszeiten von unter einer Millisekunde und kann so Millionen von Anforderungen für Echtzeitanwendungen in den Bereichen Gaming, Ad-Tech, Finanzdienstleistungen, Gesundheitswesen und IoT verarbeiten.

Wer, wann und warum?

Salvatore Sanfilippo auf der RedisConf17[1]

Der Entwickler von Redis ist Salvatore Sanfilippo im Jahr 2009 am 10 April. Das Redis-Projekt begann, als Salvatore Sanfilippo, der ursprüngliche Entwickler von Redis, versuchte, die Skalierbarkeit seines italienischen Startups zu verbessern, indem er einen Echtzeit-Weblog-Analysator entwickelte. Nachdem Probleme bei der Skalierung einiger Arten von Workloads mit herkömmlichen Datenbanksystemen entstanden, begann Sanfilippo 2009 mit der Entwicklung eines Prototyps einer ersten Proof-of-Concept-Version von Redis in der Programmiersprache Tcl. Später übersetzte Sanfilippo diesen Prototyp in die C-Sprache und implementierte den ersten Datentyp, die Liste. Nach einigen Wochen erfolgreicher interner Nutzung des Projekts entschied sich Sanfilippo, es als Open Source zu veröffentlichen.

Wie funktioniert Redis?

Strings

Mit Hilfe des set-Befehls kann man einen String erstellen.

127.0.0.1:6397> set foo "Hi"

127.0.0.1:6397> set value 1

Ruft man die Einträge foo und value nun mit get auf, werden die entsprechenden Werte angezeigt.

127.0.0.1:6397> get foo
"Hi"
127.0.0.1:6397> get value
"1"

Um einen Eintrag zu löschen, verwendet man den del-Befehl.

127.0.0.1:6397> del foo
(integer) 1
127.0.0.1:6397> get foo
(nil)

Wer nicht viele Einträge mit einer Extrazeile Code anlegen möchte, kann die erweiterte Funktion mset verwenden. Um die Werte von mehreren Einträgen gleichzeitig abzurufen, existiert parallel mget.

127.0.0.1:6397> mset foo1 "Hi1" foo2 "Hi2" foo3 "Hi3"
OK
127.0.0.1:6397> mget foo1 foo2 foo3
1) "Hi1"
2) "Hi2"
3) "Hi3"


Lists

Mit Redis kann man aber auch andere Datentypen verwenden. Bei der Arbeit mit der Datenbank sind z. B. Listen und Sets beliebt. Beides sind Ansammlungen von Werten. Während Sets allerdings unsortiert sind, sind die Werte in Listen durchnummeriert. Man kann in Listen Einträge hinzufügen, abfragen und wieder löschen.

127.0.0.1:6397> lpush mylist foo
(integer) 1
127.0.0.1:6397> lpush mylist Hi
(integer) 2
127.0.0.1:6397> lrange mylist 0 10
1) "foo"
2) "Hi"
127.0.0.1:6397> linsert mylist before "Hi" "test"
(integer) 3
127.0.0.1:6397> lrange mylist 0 10
1) "foo"
2) "test"
3) "Hi"
127.0.0.1:6397> lrem mylist 0 foo
(integer) 1
127.0.0.1:6397> lrange mylist 0 10
1) "test"
2) "Hi"

In diesem Beispiel haben wir zunächst zwei Elemente in eine Liste eingefügt (lpush) und uns diese anzeigen lassen. Bei dem Befehl lrange gibt man an, welcher Bereich (hier 0 bis 10) wiedergegeben werden soll, wobei man auch negative Zahlen verwenden kann. Anschließend haben wir mit linsert einen weiteren Wert vor einen bestehenden eingefügt (auch after wäre hier möglich) und damit die Nummerierung verändert. Der Befehl lrem kann Einträge mit einem spezifischen Wert aus der Liste löschen.

Sets

Für Sets kennt Redis andere Befehle, die aber ähnliche Ergebnisse liefern:

127.0.0.1:6397> sadd myset "foo"
(integer) 1
127.0.0.1:6397> sadd myset "Hi"
(integer) 1
127.0.0.1:6397> smembers myset
1) "Hi"
2) "foo"
127.0.0.1:6397> sismember myset "Hi"
(integer) 1
127.0.0.1:6397> srem myset "Hi"
(integer) 1
127.0.0.1:6397> smembers myset
1) "foo"

Mit sadd lassen sich auch mehrere Elemente gleichzeitig in das Set aufnehmen, wenn man diese im Kommando nacheinander einfügt. Um sich das Set anzeigen zu lassen, reicht der Befehl smembers und der Name des gewünschten Sets. Über den Befehl sismember kann man zudem nach einem bestimmten Eintrag suchen. Analog zur Liste kann man mit srem einzelne Einträge löschen.

Redis gibt Nutzern aber auch die Möglichkeit, Sets in einem sortierten Format zu verwenden.

127.0.0.1:6397> zadd mysortedset 1 "foo"
(integer) 1
127.0.0.1:6397> zadd mysortedset 2 "Hi"
(integer) 1
127.0.0.1:6397> zadd mysortedset 2 "fooHi"
(integer) 1
127.0.0.1:6397> zrange mysortedset 0 10
1) "foo"
2) "Hi"
3) "fooHi"

Zum Hinzufügen von Elementen verwendet man bei dieser Variante den Befehl zadd und einen Score. Während die Werte selbst nicht mehrfach auftreten können, darf man beim Score mehrfach die gleiche Zahl angeben. Der Score ist also keine direkte Nummerierung innerhalb des Sets, sondern eine Gewichtung. Alle Einträge mit dem Score 2 kommen nach den Elementen mit dem Score 1. Anzeigen lassen kann man sich alle oder nur ausgewählte Einträge mit zrange.

Die Vorteile von Redis

Leistung

Alle Redis-Daten befinden sich im Arbeitsspeicher, was niedrige Latenzzeiten und einen hohen Datendurchsatz ermöglicht.

Flexible Datenstrukturen

  • Zeichenfolgen – Text- oder Binärdaten mit einer Größe von bis zu 512 MB
  • Listen – mehrere Zeichenfolgen in der Reihenfolge ihrer Hinzufügung
  • Sätze – mehrere unsortierte Zeichenfolgen, die sich mit anderen Satzarten überschneiden, vereinen oder voneinander unterscheiden können
  • Sortierte Sets – nach Wert aufgelistete Sets
  • Hashes – eine Datenstruktur zum Speichern einer Liste mit Feldern und Werten
  • Bitmuster – ein Datentyp, der Vorgänge auf Bitebene ermöglicht
  • HyperLogLogs - eine probabilistische Datenstruktur zur Schätzung der eindeutigen Elemente in einem Datensatz
  • Streams - eine Protokolldatenstruktur-Nachrichtenwarteschlange
  • Geospatial - ein auf Längen- und Breitengraden basierender Eintrag für Karten, „in der Nähe“
  • JSON – ein verschachteltes, halbstrukturiertes Objekt mit benannten Werten, das Zahlen, Zeichenfolgen, Boolesche Werte, Arrays und andere Objekte unterstützt

Einfachheit und Benutzerfreundlichkeit

Redis ermöglicht, traditionelle und komplexe Codes mit weniger und einfacheren Zeilen zu schreiben. Mit Redis schreibt man weniger Codezeilen, um Daten in den Anwendungen zu speichern, darauf zuzugreifen und sie zu nutzen. Der Unterschied besteht darin, dass Entwickler, die Redis verwenden, eine einfache Befehlsstruktur verwenden können, im Gegensatz zu den Abfragesprachen herkömmlicher Datenbanken. Sie können zum Beispiel die Redis-Hash-Datenstruktur verwenden, um Daten mit nur einer Zeile Code in einen Datenspeicher zu verschieben. Redis-Entwicklern stehen mehr als einhundert Open-Source-Clients zur Verfügung. Zu den unterstützten Sprachen gehören Java, Python, PHP, C, C++, C#, JavaScript, Node.js, Ruby, R, Go und viele andere.

Open Source

Die Open-Source-Software kann meistens kostenlos genutzt werden, wessen Quelltext öffentlich und von Dritten eingesehen, geändert und genutzt werden kann.

Weblinks

Quellen