Czy Redis to tylko pamięć podręczna?

255

Czytałem niektóre dokumenty Redis i próbowałem samouczka na stronie http://try.redis-db.com/ . Jak dotąd nie widzę żadnej różnicy między Redis a technologiami buforowania, takimi jak Velocity lub Enterprise Library Caching Framework

Skutecznie dodajesz obiekty do magazynu danych w pamięci za pomocą unikalnego klucza. Wydaje się, że nie ma żadnej semantyki relacyjnej ...

czego mi brakuje?

Matt Evans
źródło
3
Od redis.io : Redis to otwarty, zaawansowany magazyn kluczy i wartości. Często nazywany jest serwerem struktury danych, ponieważ klucze mogą zawierać ciągi, skróty, listy, zestawy i zestawy posortowane. Mimo to głosowałem za zamknięciem twojego pytania, ponieważ nie pasuje ono do formatu StackOverflow.
Linus Thiel,
29
Zgadzam się, że nie jest to format SO. Jak myślisz, gdzie byłoby to bardziej odpowiednie?
Matt Evans,

Odpowiedzi:

631

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 zrevrangei 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 subscribeużytkownicy przechodzą do określonego kanału. Po dodaniu nowego pytania otrzymasz publishwiadomość 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

Sripathi Krishnan
źródło
15
Jest to również bardzo prosta magistrala serwisowa, wykorzystująca polecenia związane z PUB / SUB.
Jim Dennis
3
Jak mogę uzyskać pytanie od użytkownika? Czy powinienem utworzyć listę dla każdego użytkownika z Twoimi pytaniami, takimi jak pytania: użytkownik: 1, czy powinienem używać tagów?
Diogo Alves,
2
bardzo przydatne i szczegółowe wyjaśnienie, które widziałem na SO
Trong Vu
5

Nie tylko pamięć podręczna.

  • W pamięci klucz-wartość
  • Obsługa wielu typów danych (ciągów, skrótów, list, zestawów, sortowanych zestawów, map bitowych i hiperlogów)
  • Zapewnia możliwość przechowywania danych w pamięci podręcznej w pamięci fizycznej (w razie potrzeby).
  • Obsługuje model pub-sub
  • Pamięć podręczna Redis zapewnia replikację w celu zapewnienia wysokiej dostępności (master / slave)
Pankaj Rawat
źródło
4

Redis ma unikalne zdolności, takie jak ultraszybkie skrypty Lua. Jego czas wykonania jest równy wykonywaniu poleceń C. Daje to także atomowość zaawansowanym manipulacjom danych Redis wymaganym do pracy wielu zaawansowanych obiektów, takich jak Zamki i Semafory.

W siatce danych pamięci znajduje się Redis o nazwie Redisson, który pozwala łatwo budować rozproszoną aplikację na Javie . Dzięki rozproszonych Lock, Semaphore, ReadWriteLock, CountDownLatch, ConcurrentMapprzedmioty i wiele innych.

Doskonale działa w chmurze i wspiera AWS Elasticache , AWS Elasticache Cluster i Azure Redis Cache wsparcia

Nikita Koksharov
źródło
1

W rzeczywistości nie ma zależności między względną reprezentacją danych (lub jakimkolwiek typem reprezentacji danych) a rolą bazy danych (pamięć podręczna, trwałe utrwalanie itp.).

Redis jest dobry na pamięć podręczną, to prawda, ale to znacznie więcej niż tylko pamięć podręczna. Jest to szybka baza danych z pełną pamięcią. Przechowuje dane na dysku. To nie jest relacyjny, to pamięć klucz-wartość.

Używamy go w produkcji. Redis pomaga nam tworzyć oprogramowanie, które obsługuje tysiące żądań na sekundę i utrzymuje dane biznesowe klientów przez cały naturalny cykl życia.

Denys
źródło
0

Redis to pamięć podręczna, która najlepiej nadaje się do środowiska rozproszonego / architektury Microservice.

Jest szybki, niezawodny, zapewnia atomowość i spójność oraz ma szereg typów danych, takich jak zestawy, skróty, listy itp.

Używam go od zeszłego roku i naprawdę przychodzi jako wybawiciel, gdy trzeba bardzo szybko dostarczyć gotowe do produkcji rozwiązanie dla wszelkich problemów związanych z wydajnością, ponieważ zawsze można go użyć do buforowania danych.

Manvendra Jina
źródło
0

Oprócz tego, że jest serwerem pamięci podręcznej, Redis jest w szczególności serwerem struktury danych. Bycie pamięcią podręczną w postaci serwera struktury danych wiele znaczy, ponieważ struktury danych są podstawą programów lub aplikacji . Weź pod uwagę, że używasz baz danych SQL jako technologii przechowywania i potrzebujesz skonstruować listę, mapę haszową, zestaw rankingowy lub coś podobnego, to rodzaj bólu w szyi. Redis może zapewnić te funkcje bezpośrednio w bardzo prosty sposób, co znacznie upraszcza rozwój.

Z drugiej strony serwer struktury danych nie musi mieć postaci pamięci podręcznej. Istnieją projekty kompatybilne z Redis, ale mają trwałe silniki pamięci masowej.

不辞 长 做 岭南 人
źródło
0

Redis obsługuje struktury danych, takie jak ciągi, skróty, listy, zestawy, zestawy posortowane z zapytaniami o zakres, bitmapami, hiperlogami, indeksami geoprzestrzennymi z zapytaniami o promienie i strumieniami. Redis ma wbudowaną replikację, skrypty Lua, eksmisję LRU, transakcje i różne poziomy trwałości na dysku, a także zapewnia wysoką dostępność za pośrednictwem Redis Sentinel i automatyczne partycjonowanie za pomocą klastra Redis.

implementacja z pythonem

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

Vijay
źródło