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. W Redis jest 5 typów danych - ciągi, zestawy, skróty, listy i posortowane zestawy. Każdy typ danych udostępnia 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.
Pytania, użytkownicy i odpowiedzi dotyczące modelowania
Każdy obiekt można zamodelować jako mapę. Na przykład pytanie to mapa z polami {id, tytuł, data_zadana, głosy, zadane_przez, status}. Podobnie odpowiedź to mapa z polami {id, question_id, answer_text, answer_by, vote, 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 atomic increment. 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
Rozpatrywanie głosów
Teraz za każdym razem, gdy ktoś zagłosuje za pytaniem lub odpowiedzią, wystarczy to zrobić
$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2
Lista pytań dotyczących strony głównej
Następnie chcemy przechowywać najnowsze pytania do wyświetlenia na stronie głównej. Jeśli piszesz program .NET lub Java, przechowujesz pytania na liście. Okazuje się, że jest to najlepszy sposób na przechowywanie tego również w Redis.
Za każdym razem, gdy ktoś zadaje pytanie, dodajemy jego id do listy.
$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1
Teraz, gdy chcesz wyrenderować swoją stronę główną, zadaj 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ą potoku 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ć najczęściej głosowane pytania, nowe pytania lub pytania bez odpowiedzi pod każdym tagiem.
Aby to zamodelować, używamy funkcji sortowanego zestawu Redis. Posortowany zestaw umożliwia powiązanie wyniku z każdym elementem. Następnie możesz pobrać elementy na podstawie ich wyników.
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 tutaj zrobiliśmy? Dodaliśmy pytania do posortowanego zestawu i powiązaliśmy punktację (liczbę głosów) z każdym pytaniem. Za każdym razem, gdy pytanie zostanie przegłosowane, zwiększymy jego wynik. A kiedy użytkownik kliknie „Pytania otagowane Redis, posortowane według głosów”, po prostu wykonujemy zrevrange
i odzyskaj najważniejsze pytania.
Pytania w czasie rzeczywistym bez odświeżania strony
I na koniec funkcja bonusowa. Jeśli pozostawisz 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żytkowników do określonego kanału. Po dodaniu nowego pytania publish
wiadomość do tego kanału. Wszyscy użytkownicy otrzymaliby wtedy wiadomość. Będziesz musiał użyć technologii internetowej, takiej jak gniazda sieciowe lub kometa, aby faktycznie dostarczyć wiadomość do przeglądarki, ale Redis pomaga ci we wszystkich hydraulikach po stronie serwera.
Wytrzymałość, niezawodność itp.
W przeciwieństwie do pamięci podręcznej Redis przechowuje 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