Redis jest popularnym projektem open sourcowym, który od roku 2013 zyskuje coraz to większą i większą rozpoznawalność w światku IT. Dziś, w roku 2021, Redis jest znany jako NoSQL-owa baza danych klucz-wartość działająca w pamięci, a jej najpopularniejsze wykorzystanie to cache. Natomiast nie są to wszystkie zalety Redisa, ale o tym dowiesz się w dalszej części tego artykułu.
Cześć
W dzisiejszym artykule:
Czym jest Redis
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions, and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
Jest to opis wzięty z oficjalnej strony autorów oprogramowania. Jak wspomniano, Redis przechowuje dane w pamięci. Nie są one zapisywane na dysku, co zapewnia niezwykle szybki dostęp. Z tego też powodu, Redis jest właśnie często używany jako pamięć podręczna (cache), i/lub pomocnicza baza danych (secondary database).
Z racji, że pamięć jest ulotna, a może się zdarzyć, że nasza aplikacja ulegnie awarii, Redis pozwala podjąć pewne środki zaradcze, poprzez zapisywanie danych na dysku. Możliwość persystencji danych jest jego ogromną zaletą w porównaniu do innych providerów zapewniających cache’owanie.
Podsumowując to prostym językiem – Redis to działająca w pamięci baza klucz-wartość. Sama nazwa, Redis jest akronimem słów Remote (RE) Dictionary (DI) Server (S).
Dlaczego warto używać Redisa?
Każde oprogramowanie, jakie by nie było będzie mieć wady i zalety. Jako świadomi programiści, architekci czy inne osoby podejmujące decyzje techniczne, zanim zdecydujemy się na wybór konkretnego dostawcy oprogramowania powinniśmy rozważyć powody za i przeciw jego użyciu. W Internecie znajdziesz kilka artykułów opisujących wady i zalety Redisa [1,2] z którymi warto się zapoznać przed podjęciem decyzji. Dobrze byłoby również porozmawiać z innymi osobami, które takiego rozwiązania już używają i wyciągnąć od nich informacje/wskazówki.
W tym artykule przedstawię Ci kilka, moim zdaniem istotnych zalet Redisa.
Wydajność
Redis pozwala nawet na 120 000 żądań na sekundę! Więcej o benchmarkach można poczytać na ich stronie.
Wysoka dostępność i skalowalność
Redis oferuje architekturę typu primary-replica w pojedynczym węźle lub w topologii klastrowej. Pozwala to na tworzenie wysoce dostępnych rozwiązań zapewniających stałą wydajność i niezawodność. W przypadku konieczności dostosowania rozmiaru klastra, dostępne są również różne opcje skalowania i powiększania lub zmniejszania. Pozwala to na rozwój klastra wraz z potrzebami.
Replikacja i Trwałość (Durability)
Redis obsługuje replikację asynchroniczną, w której dane mogą być replikowane na wielu serwerach replik. Zapewnia to lepszą wydajność odczytu (ponieważ żądania mogą być dzielone między serwery) i szybsze odzyskiwanie w przypadku awarii serwera głównego. W celu zachowania trwałości Redis obsługuje kopie zapasowe w określonym momencie (kopiowanie danych na dysk).
Prostota i łatwość obsługi
Redis upraszcza kod, umożliwiając zapisanie mniejszej ilości linii kodu do przechowywania, dostępu i korzystania z danych w aplikacjach. Posiada natywne struktury danych i wiele opcji do manipulacji i interakcji z danymi. Obsługuje wiele języków oprogramowania, m.in: Java, Python, PHP, C, C++, C#, JavaScript, Node.js, Ruby, R, Go i wiele innych. Również popularne frameworki wspierają prostą integrację z Redisem.
Rozszerzalność
Redis jest projektem open source. Jest oparty na standardach, obsługuje różne formaty danych i posiada bogaty zestaw klientów.
Do czego stosować?
Spora część czytelników zapewne odpowie, że Redisa wykorzystujemy jako pamięć cache i kropka. Sam bym tak odpowiedział gdybym nie pisał tego artykułu :). Jednak Redis może być wykorzystany szerzej. Jasne, wykorzystanie go jako cache jest ogromną zaletą, ale poznajmy też inne możliwości, aby w przyszłości móc rozważyć użycie Redisa również w innych aspektach.
Caching
Redis jest doskonałym wyborem do implementacji wysoce dostępnej pamięci podręcznej w celu zmniejszenia opóźnień w dostępie do danych oraz odciążenia bazy danych i aplikacji. Może obsługiwać często wymagane elementy w czasie krótszym niż milisekunda i umożliwia łatwe skalowanie dla większych obciążeń bez zwiększania kosztu backendu.
Chat, messaging, and queues
Redis obsługuje wzorzec Pub/Sub i różne struktury danych, takie jak listy, posortowane zbiory i hashe. Dzięki temu Redis może obsługiwać wysokowydajne czaty, strumienie komentarzy w czasie rzeczywistym, kanały mediów społecznościowych i komunikację między serwerami. Listy ułatwiają również wdrożenie kolejek. Oferują zarówno operacje atomowe, jak i możliwości blokowania, dzięki czemu nadają się do różnych zastosowań, które wymagają niezawodnego brokera wiadomości.
Gaming leaderboards
Redis wykonuje niesamowitą pracę w inkrementacji i dekrementacji, ponieważ jest w pamięci. Zbiory (Sets) i posortowane zbiory (Sorted Sets) ułatwiają nam również życie, gdy próbujemy wykonywać tego typu operacje, a tak się składa, że Redis oferuje obie te struktury danych. Przykładowo aby wyciągnąć 10 najlepszych użytkowników z posortowanego zestawu – nazwiemy go „user_scores” – można po prostu uruchomić następujące polecenie:
1 | ZRANGE user_scores 0 10 |
Rich media streaming
Redis może być używany do przechowywania metadanych o profilach użytkowników i ich historii przeglądania, informacji uwierzytelniających/tokenów dla milionów użytkowników, plików manifestów aby umożliwić CDN-om strumieniowe przesyłanie wideo do milionów użytkowników mobilnych i webowych w tym samym czasie.
Let’s play it
Ok. Przeszliśmy przez sekcje teoretyczne. Teraz czas na trochę zabawmy z samym Redisem z poziomu klienta. W świecie rzeczywistym raczej rzadko (o ile w ogóle) będziesz używał klienta z poziomu konsoli. Częściej będzie to zwyczajnie klient, w języku programowania w jakim rozwijasz aplikacje.
Chcąć pobawić się Redisem, mamy dwie opcje:
- Używamy wersji webowej – Try Redis
- Stawiamy kontener dockerowy
Opcja 1 jest prosta, wystarczy wejść w link i można wprowadzać komendy. Opcja 2 wymaga nieco większego wysiłku. Po pierwsze, trzeba mieć zainstalowanego dockera a następnie należy wprowadzić dwa polecenia. Pierwsze, uruchamiające Redisa:
1 | docker run --rm -it --name local-redis -p 6379:6379 redis |
oraz drugie, odpalające klienta:
1 | docker run -it --link local-redis:redis --rm redis redis-cli -h redis -p 6379 |
Teraz w kliencie śmiało można uruchamiać komendy, co będzie miało taki sam rezultat jak byśmy używali wersji webowej.
Redis zapewnia kilka struktur danych oraz zbiór komend ułatwiających manipulację na danych. Aby lepiej poznać jego możliwości przejdźmy przez podstawowe. Polecam wklepać komendy do konsoli i obserwować rezultaty. Niby dużo to nie daje, ale coś w głowie zostanie 🙂
Strings
Stringi są najbardziej podstawową strukturą danych. Są binarnie bezpieczne, to znaczy, że mogą zawierać dowolny rodzaj danych, na przykład obraz JPEG lub serializowany obiekt Rubiego. Wartość String może mieć długość maksymalnie 512 megabajtów.
1 2 3 4 5 6 7 8 9 10 11 12 13 | SET name "John" GET name EXISTS name // Check existence of key DEL name // Delete key EXPIRE name 5 // Delete key when expired SET counter 100 INCRBY counter 25 // Increments by 25 DECR counter // Decrements by 1 MSET a 10 b 20 // Multiple SET MGET a b // Multiple GET |
Lists
Listy to po prostu listy stringów, posortowane według kolejności wstawiania. Możliwe jest dodawanie nowych elementów na początek listy (head) lub na jej końcu (tail). Maksymalna długość listy wynosi (2^32) – 1 elementów (4294967295, ponad 4 miliardy elementów na listę).
1 2 3 4 5 6 | LPUSH myList 10 // Add from left to head RPUSH myList "str" // Add from right to tail LRANGE myList 0 -1 // Range from 0 to -1 LTRIM myList 0 1 // To keep latest elements RPOP myList // Pop last element |
Hashes
Hashes to mapy pomiędzy polami i wartościami string. Są one idealnym typem danych do reprezentowania obiektów (np. użytkownik z wieloma polami takimi jak imię, nazwisko, wiek itp.)
1 2 3 | HMSET user id 100 name "Smith" age 50 // Setup hash with key "user" HGET user id // Only 'id' field returned HGETALL user |
Sets
Zbiory to nieuporządkowana kolekcja stringów. Możliwe jest dodawanie, usuwanie i sprawdzanie istniejących wartości w stałym czasie (O(1)) niezależnie od ilości elementów zawartych w zbiorze. Maksymalna wielkość zbioru jest taka sama jak w przypadku listy.
1 2 3 | SADD mySet 10 45 12 // Add elements to set SMEMBERS mySet // Get all members of the set SISMEMBER mySet 10 // Returns whether value exists |
Sorted Sets
Posortowane zbiory, podobnie jak zwykłe zbiory są niepowtarzającymi się kolekcjami stringów. Różnica polega na tym, że każdy element posortowanego zbioru ma przypisany wynik (score), który jest używany w celu uporządkowania zestawu, od najmniejszego do największego wyniku. Podczas gdy elementy w zbiorze są unikalne, wyniki (score) mogą się powtarzać!
1 2 3 4 5 6 7 8 9 | ZADD children 1992 "Sam" // Birth-year acts as score ZADD children 1997 "Tom" ZRANGE children 0 -1 // Returns all in order ZREVRANGE children 0 -1 withScores // Reverse order of ZRANGE ZRANGEBYSCORE children -inf 1995 // Scores until 1993 ZREMRANGEBYSCORE children 1990 1995 // Remove from sorted set ZRANK children "Tom" // Score rank of 'Tom' |
Podsumowanie
Redis jako oprogramowanie z pewnością jest warte użycia. Korzyści płynące z wydajności wydają się jednym z głównych powodów dlaczego miałbyś użyć właśnie tego rozwiązania. Dodatkowy fakt, że jest to projekt open-source, posiadający aktywne community i mający wiele klientów w różnych językach programowania również przemawia.
Na tę chwilę (na całe szczęście) nie mam żadnych nieprzyjemnych doświadczeń z Redisem. Jeżeli masz jakieś, podziel się tym w komentarzu. Na pewno jest to ciekawy temat do eksploracji, aby zastanowić się jak używać, czego próbowali inni i na co uważać na przyszłość.
Źródła:
rozumiem, że w komentarzu miało być 1995?
Tak. Dobre oko 🙂
Dzięki za wprowadzenia, bardzo fajny artykuł, pozdrawiam 🙂
Super, jasno, prosto i przystępnie, dzięki za taki opis 🙂
🙂