Nie, Redis to znacznie więcej niż pamięć podręczna.
Podobnie jak pamięć podręczna, Redis przechowuje pary klucz = wartość. Ale w przeciwieństwie do pamięci podręcznej, Redis pozwala operować na wartościach. Istnieje 5 typów danych w Redis - ciągi, zestawy, skróty, listy i posortowane zestawy. Każdy typ danych ujawnia różne operacje.
Najlepszym sposobem na zrozumienie Redis jest modelowanie aplikacji bez zastanawiania się, jak zamierzasz ją przechowywać w bazie danych.
Powiedzmy, że chcemy zbudować StackOverflow.com. Aby było to proste, potrzebujemy pytań, odpowiedzi, tagów i użytkowników.
Modelowanie pytań, użytkowników i odpowiedzi
Każdy obiekt może być modelowany jako mapa. Na przykład Pytanie to mapa z polami {id, tytuł, data_asked, głosów, ask_by, status}. Podobnie, Odpowiedź jest mapą z polami {id, question_id, answer_text, answer_by, głosów, status}. Podobnie możemy modelować obiekt użytkownika.
Każdy z tych obiektów może być bezpośrednio przechowywany w Redis jako skrót. Aby wygenerować unikalne identyfikatory, możesz użyć polecenia przyrostu atomowego. Coś takiego -
$ 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
Obsługa głosów
Teraz, za każdym razem, gdy ktoś głosuje na pytanie lub odpowiedź, wystarczy to zrobić
$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2
Lista pytań do strony głównej
Następnie chcemy zapisać najnowsze pytania do wyświetlenia na stronie głównej. Jeśli piszesz program .NET lub Java, pytania byłyby przechowywane na liście. Okazuje się, że to najlepszy sposób na przechowywanie tego również w Redis.
Za każdym razem, gdy ktoś zadaje pytanie, dodajemy jego identyfikator do listy.
$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1
Teraz, gdy chcesz wyrenderować swoją stronę główną, zadajesz Redisowi ostatnie 25 pytań.
$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"
Teraz, gdy masz już identyfikatory, pobierz elementy z Redis za pomocą potokowania i pokaż je użytkownikowi.
Pytania według tagów, posortowane według głosów
Następnie chcemy pobrać pytania dla każdego tagu. Ale SO pozwala zobaczyć pod każdym tagiem najczęściej zadawane pytania, nowe pytania lub pytania bez odpowiedzi.
Aby to wymodelować, używamy funkcji Redis 'Sorted Set. Zestaw posortowany pozwala powiązać wynik z każdym elementem. Następnie można wyszukiwać elementy na podstawie ich wyników.
Dalej, zróbmy to dla tagu Redis
$ 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"
Co my tu zrobiliśmy? Dodaliśmy pytania do posortowanego zestawu i do każdego pytania przypisaliśmy wynik (liczbę głosów). Za każdym razem, gdy pytanie zostanie ocenione, zwiększymy jego wynik. A kiedy użytkownik kliknie „Pytania oznaczone Redis, posortowane według głosów”, po prostu robimy zrevrange
i otrzymujemy najważniejsze pytania.
Pytania w czasie rzeczywistym bez odświeżania strony
I wreszcie funkcja dodatkowa. Jeśli utrzymasz otwartą stronę pytań, SO powiadomi Cię o dodaniu nowego pytania. Jak Redis może tutaj pomóc?
Redis ma model pub-sub. Możesz tworzyć kanały, na przykład „channel_questions_tagged_redis”. Następnie subscribe
użytkownicy przechodzą do określonego kanału. Po dodaniu nowego pytania otrzymasz publish
wiadomość do tego kanału. Wszyscy użytkownicy otrzymaliby wtedy wiadomość. Będziesz musiał użyć technologii sieciowej, takiej jak gniazda sieciowe lub kometa, aby faktycznie dostarczyć wiadomość do przeglądarki, ale Redis pomaga ci w całej instalacji hydraulicznej po stronie serwera.
Trwałość, niezawodność itp.
W przeciwieństwie do pamięci podręcznej, Redis utrzymuje dane na dysku twardym. Możesz mieć konfigurację master-slave, aby zapewnić lepszą niezawodność. Aby dowiedzieć się więcej, przejdź do tematów dotyczących trwałości i replikacji tutaj - http://redis.io/documentation