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 zrevrange
und 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 subscribe
zu einem bestimmten Kanal. Wenn eine neue Frage hinzugefügt wird, würden Sie publish
eine 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