Ist Redis nur ein Cache?


255

Ich habe einige Redis-Dokumente gelesen und das Tutorial unter http://try.redis-db.com/ ausprobiert . Bisher kann ich keinen Unterschied zwischen Redis und Caching-Technologien wie Velocity oder dem Enterprise Library Caching Framework feststellen

Sie fügen einem speicherinternen Datenspeicher effektiv nur Objekte mit einem eindeutigen Schlüssel hinzu. Es scheint keine relationale Semantik zu geben ...

Was vermisse ich?


3
Von redis.io : Redis ist ein Open-Source-Speicher für erweiterte Schlüsselwerte. Es wird häufig als Datenstruktur-Server bezeichnet, da Schlüssel Zeichenfolgen, Hashes, Listen, Mengen und sortierte Mengen enthalten können. Trotzdem habe ich dafür gestimmt, Ihre Frage zu schließen, da sie nicht zum Format von StackOverflow passt.
Linus Thiel

29
Ich bin damit einverstanden, dass es kein SO-Format ist. Wo denkst du, wäre es angemessener?
Matt Evans

Antworten:


631

Nein, Redis ist viel mehr als ein Cache.

Wie ein Cache speichert Redis Schlüssel-Wert-Paare. Im Gegensatz zu einem Cache können Sie mit Redis die Werte bearbeiten. Es gibt 5 Datentypen in Redis - Strings, Sets, Hash, Lists und Sorted Sets. Jeder Datentyp macht verschiedene Operationen verfügbar.

Der beste Weg, um Redis zu verstehen, besteht darin, eine Anwendung zu modellieren, ohne darüber nachzudenken, wie Sie sie in einer Datenbank speichern werden.

Nehmen wir an, wir möchten StackOverflow.com erstellen. Um es einfach zu halten, benötigen wir Fragen, Antworten, Tags und Benutzer.

Modellieren von Fragen, Benutzern und Antworten

Jedes Objekt kann als Karte modelliert werden. Eine Frage ist beispielsweise eine Karte mit den Feldern {ID, Titel, Datumsanfrage, Stimmen, Nachfrage, Status}. Ebenso ist eine Antwort eine Karte mit den Feldern {id, question_id, answer_text, reply_by, Stimmen, Status}. Ebenso können wir ein Benutzerobjekt modellieren.

Jedes dieser Objekte kann direkt in Redis als Hash gespeichert werden. Um eindeutige IDs zu generieren, können Sie den Befehl atomares Inkrement verwenden. Etwas wie das -

$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK

$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK

Umgang mit Stimmen

Jedes Mal, wenn jemand eine Frage oder Antwort positiv bewertet, müssen Sie dies nur tun

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

Liste der Fragen zur Homepage

Als Nächstes möchten wir die neuesten Fragen speichern, die auf der Startseite angezeigt werden sollen. Wenn Sie ein .NET- oder Java-Programm schreiben, speichern Sie die Fragen in einer Liste. Es stellt sich heraus, dass dies der beste Weg ist, dies auch in Redis zu speichern.

Jedes Mal, wenn jemand eine Frage stellt, fügen wir seine ID der Liste hinzu.

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

Wenn Sie jetzt Ihre Homepage rendern möchten, stellen Sie Redis die letzten 25 Fragen.

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

Nachdem Sie die IDs haben, rufen Sie Elemente mithilfe von Pipelining von Redis ab und zeigen Sie sie dem Benutzer an.

Fragen nach Tags, sortiert nach Stimmen

Als nächstes möchten wir Fragen für jedes Tag abrufen. Mit SO können Sie jedoch unter jedem Tag die am häufigsten bewerteten Fragen, neuen Fragen oder unbeantworteten Fragen anzeigen.

Um dies zu modellieren, verwenden wir die Funktion "Sortiertes Set" von Redis. Mit einem sortierten Satz können Sie jedem Element eine Punktzahl zuordnen. Sie können dann Elemente basierend auf ihren Punktzahlen abrufen.

Machen wir das für das Redis-Tag

$ zadd questions_by_votes_tagged:redis 2 question:1 
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2 
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613 
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5 
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5 
1) "question:2"
2) "question:613"
3) "question:1"

Was haben wir hier gemacht? Wir haben einem sortierten Satz Fragen hinzugefügt und jeder Frage eine Punktzahl (Anzahl der Stimmen) zugeordnet. Jedes Mal, wenn eine Frage positiv bewertet wird, erhöhen wir ihre Punktzahl. Und wenn ein Benutzer auf "Fragen mit dem Tag Redis, sortiert nach Stimmen" klickt, führen wir einfach eine aus zrevrangeund erhalten die wichtigsten Fragen zurück.

Echtzeitfragen ohne Seite zu aktualisieren

Und schließlich eine Bonusfunktion. Wenn Sie die Fragenseite geöffnet lassen, werden Sie von SO benachrichtigt, wenn eine neue Frage hinzugefügt wird. Wie kann Redis hier helfen?

Redis hat ein Pub-Sub-Modell. Sie können Kanäle erstellen, z. B. "channel_questions_tagged_redis". Sie gelangen dann subscribezu einem bestimmten Kanal. Wenn eine neue Frage hinzugefügt wird, würden Sie publisheine Nachricht an diesen Kanal senden. Alle Benutzer würden dann die Nachricht erhalten. Sie müssen eine Webtechnologie wie Web-Sockets oder Kometen verwenden, um die Nachricht tatsächlich an den Browser zu übermitteln. Redis hilft Ihnen jedoch bei allen Installationsarbeiten auf der Serverseite.

Ausdauer, Zuverlässigkeit usw.

Im Gegensatz zu einem Cache behält Redis Daten auf der Festplatte bei. Sie können ein Master-Slave-Setup verwenden, um eine bessere Zuverlässigkeit zu gewährleisten. Weitere Informationen finden Sie hier unter Persistenz- und Replikationsthemen - http://redis.io/documentation


15
Es ist auch ein extrem einfacher Servicebus, der die PUB / SUB-bezogenen Befehle verwendet.
Jim Dennis

3
Wie kann ich Fragen vom Benutzer abrufen? Sollte ich für jeden Benutzer eine Liste mit Ihren Fragen erstellen, z. B. Fragen: Benutzer: 1, oder sollte ich Tags verwenden?
Diogo Alves

2
sehr nützliche und detaillierte Erklärung, die ich alle auf SO gesehen habe
Trong Vu

5

Nicht nur ein Cache.

  • Im Speicher Schlüsselwertspeicher
  • Unterstützt mehrere Datentypen (Zeichenfolgen, Hashes, Listen, Mengen, sortierte Mengen, Bitmaps und Hyperloglogs)
  • Es bietet die Möglichkeit, Cache-Daten im physischen Speicher zu speichern (falls erforderlich).
  • Unterstützt Pub-Sub-Modell
  • Der Redis-Cache bietet Replikation für hohe Verfügbarkeit (Master / Slave)

4

Redis verfügt über einzigartige Fähigkeiten wie ultraschnelle Lua-Skripte. Seine Ausführungszeit entspricht der Ausführung von C-Befehlen. Dies bringt auch Atomizität für eine ausgefeilte Redis-Datenmanipulation mit sich, die für die Arbeit mit vielen fortgeschrittenen Objekten wie Locks und Semaphoren erforderlich ist.

Es gibt ein Redis-basiertes Speicherdatenraster namens Redisson , mit dem verteilte Anwendungen einfach auf Java erstellt werden können . Dank verteilt Lock, Semaphore, ReadWriteLock, CountDownLatch, ConcurrentMapObjekte und viele andere.

Perfekt funktioniert in Cloud und unterstützt AWS ElastiCache , AWS ElastiCache Cluster und Azure Redis Cache - Unterstützung


1

Tatsächlich besteht keine Abhängigkeit zwischen der relativen Datendarstellung (oder einer beliebigen Art der Datendarstellung) und der Datenbankrolle (Cache, permanente Persistenz usw.).

Redis ist gut für den Cache, aber es ist viel mehr als nur ein Cache. Es ist eine Hochgeschwindigkeits-In-Memory-Datenbank. Daten auf der Festplatte bleiben erhalten. Es ist nicht relational, sondern ein Schlüsselwertspeicher.

Wir verwenden es in der Produktion. Redis hilft uns dabei, Software zu entwickeln, die Tausende von Anfragen pro Sekunde verarbeitet und Kundengeschäftsdaten während des gesamten natürlichen Lebenszyklus speichert.


0

Redis ist ein Cache, der am besten für verteilte Umgebungen / Microservice-Architekturen geeignet ist.

Es ist schnell, zuverlässig, bietet Atomizität und Konsistenz und verfügt über eine Reihe von Datentypen wie Mengen, Hashes, Listen usw.

Ich verwende es seit einem Jahr und es ist wirklich ein Retter, wenn Sie eine produktionsbereite Lösung sehr schnell und für alle leistungsbezogenen Probleme bereitstellen müssen, da Sie es immer zum Zwischenspeichern von Daten verwenden können.


0

Redis ist nicht nur ein Cache-Server, sondern auch ein Datenstruktur-Server. Ein Cache in Form eines Datenstruktur-Servers zu sein, bedeutet viel, da Datenstrukturen Grundlagen von Programmen oder Anwendungen sind . Stellen Sie sich vor, Sie verwenden SQL-Datenbanken als Speichertechnologie und müssen eine Liste, eine Hash-Map, eine Rangliste oder ähnliches erstellen. Das ist eine Art Nackenschmerzen. Redis kann Ihnen diese Funktionen auf sehr einfache Weise direkt zur Verfügung stellen und so die Entwicklung erheblich vereinfachen.

Andererseits muss ein Datenstruktur-Server nicht in Form eines Caches vorliegen. Es gibt Projekte, die mit Redis kompatibel sind, aber dauerhafte Speicher-Engines haben.


0

Redis unterstützt Datenstrukturen wie Zeichenfolgen, Hashes, Listen, Mengen, sortierte Mengen mit Bereichsabfragen, Bitmaps, Hyperloglogs, Geodaten mit Radiusabfragen und Streams. Redis verfügt über integrierte Replikation, Lua-Skripterstellung, LRU-Räumung, Transaktionen und verschiedene Ebenen der Persistenz auf der Festplatte und bietet hohe Verfügbarkeit über Redis Sentinel und automatische Partitionierung mit Redis Cluster.

Implementierung mit Python

https://beyondexperiment.com/vijayravichandran06/redis-data-structure-with-python/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.