Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Ist Redis nur ein Cache?

Nein, Redis ist viel mehr als ein Cache.

Wie ein Cache speichert Redis Schlüssel=Wert-Paare. Aber im Gegensatz zu einem Cache können Sie mit Redis mit den Werten arbeiten. Es gibt 5 Datentypen in Redis – Strings, Sets, Hash, Lists und Sorted Sets. Jeder Datentyp macht verschiedene Operationen verfügbar.

Der beste Weg, 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, brauchen wir Fragen, Antworten, Tags und Benutzer.

Modellierungsfragen, Benutzer und Antworten

Jedes Objekt kann als Map modelliert werden. Eine Frage ist beispielsweise eine Karte mit den Feldern {id, title, date_asked, votes, asked_by, status}. Ähnlich ist eine Antwort eine Karte mit Feldern {id, question_id, answer_text, answer_by, votes, status}. Ebenso können wir ein Benutzerobjekt modellieren.

Jedes dieser Objekte kann direkt als Hash in Redis gespeichert werden. Um eindeutige IDs zu generieren, können Sie den Befehl Atomic Increment verwenden. Etwas in der Art -

$ 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

Nun, jedes Mal, wenn jemand eine Frage oder Antwort positiv bewertet, müssen Sie dies einfach tun

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

Fragenliste für 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 würden, würden Sie die Fragen in einer Liste speichern. Es stellt sich heraus, dass dies auch der beste Weg ist, dies 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, fragen Sie Redis nach den 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 nun die IDs haben, können Sie mithilfe von Pipelining Elemente aus Redis abrufen und sie dem Benutzer zeigen.

Fragen nach Tags, sortiert nach Stimmen

Als Nächstes möchten wir Fragen für jedes Tag abrufen. Aber SO ermöglicht es Ihnen, die am häufigsten bewerteten Fragen, neue Fragen oder unbeantwortete Fragen unter jedem Tag zu sehen.

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

Machen wir weiter und tun dies 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 Fragen zu einem sortierten Satz hinzugefügt und jeder Frage eine Bewertung (Anzahl der Stimmen) zugeordnet. Jedes Mal, wenn eine Frage positiv bewertet wird, erhöhen wir ihre Punktzahl. Und wenn ein Benutzer auf „Questions tagged Redis, sorted by votes“ klickt, machen wir einfach einen zrevrange und erhalten Sie die Top-Fragen zurück.

Echtzeitfragen ohne Seitenaktualisierung

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, zum Beispiel "channel_questions_tagged_redis". Sie subscribe dann Benutzer zu einem bestimmten Kanal. Wenn eine neue Frage hinzugefügt wird, würden Sie sie publish eine Nachricht an diesen Kanal. Alle Benutzer würden dann die Nachricht erhalten. Sie müssen eine Webtechnologie wie Web-Sockets oder Comet verwenden, um die Nachricht tatsächlich an den Browser zu übermitteln, aber Redis hilft Ihnen bei allen Arbeiten auf der Serverseite.

Beharrlichkeit, Zuverlässigkeit etc.

Im Gegensatz zu einem Cache speichert Redis Daten auf der Festplatte. Sie können ein Master-Slave-Setup haben, um eine bessere Zuverlässigkeit zu bieten. Um mehr zu erfahren, gehen Sie hier die Themen zu Persistenz und Replikation durch – http://redis.io/documentation