Redis oznacza RE mote DI fikcyjny S serwer, stworzony w 2009 roku przez Salvatore Sanfilippo. Z kolei Memcached został stworzony w 2003 roku przez Brada Fitzpatricka. Zarówno Redis, jak i Memcached to:
- Struktury danych w pamięci NoSQL
- Napisane w C
- Otwórz źródło
- Służy do przyspieszania aplikacji
- Obsługa opóźnienia poniżej milisekundy
W 2014 roku Salvatore napisał doskonały post na StackOverflow, w którym bardziej sensowne jest używanie Memcached niż Redis. W tym poście przedstawiamy aktualne i szczegółowe porównanie między Redis i Memcached, dzięki czemu możesz dokonać świadomego wyboru ich wykorzystania w swojej aplikacji.
Infografika
Ten post został skrócony do poniższej infografiki. Dzięki tej infografice możesz łatwo zwizualizować wyniki tego porównania, aby zobaczyć, które z nich wypada najlepiej w różnych scenariuszach. Jeśli chcesz przeczytać porównanie w formacie tekstowym, kliknij tutaj.
Dokumentacja
Na początek Redis jest o wiele bardziej kompleksowo udokumentowany niż Memcached. Ułatwia to naukę, administrację i użytkowanie.
Model bazy danych
Redis to przede wszystkim magazyn kluczowych wartości. Chociaż klucze są ciągami binarnymi, zaletą Redis jest to, że wartość nie jest ograniczona tylko do ciągów binarnych. Mogą to być różnorodne struktury danych, które umożliwiają przechowywanie złożonych obiektów i zapewniają bogaty zestaw operacji na nich. Redis zapewnia również rozszerzalność za pośrednictwem modułów Redis. Moduły Redis to rozszerzenia, które zapewniają dodatkowe struktury danych i funkcje niedostępne w podstawowym zestawie funkcji. Oto przykład kilku funkcji, które są teraz dostępne jako moduły:
- Sklep z dokumentami
- Wykres DBMS
- Wyszukiwarka
- DBMS szeregów czasowych
Memcached to zwykły magazyn wartości klucza, który obsługuje tylko ciągi binarne jako wartość.
Struktury danych
Jak wspomniano powyżej, Redis oferuje wiele typów struktur danych, dzięki czemu jest niezwykle elastyczny w użyciu, w tym ciągi, skróty, listy, zestawy, posortowane zestawy, mapy bitowe, pola bitowe, HyperLogLog, Indeksy geoprzestrzenne i strumienie. Więcej informacji na ten temat można znaleźć w tym artykule Najważniejsze przypadki użycia Redis według podstawowych typów struktury danych.
Źródło obrazu:https://redislabs.com/redis-enterprise/data-structures/
Memcached obsługuje tylko zwykłe ciągi binarne, które doskonale nadają się do danych tylko do odczytu, więc jeśli nie potrzebujesz wszystkich dzwonków i gwizdków Redis, Memcached jest dla Ciebie prostszą bazą danych do użycia.
Ranking i popularność bazy danych
Większa popularność bazy danych skutkuje większą społecznością użytkowników, większą liczbą dyskusji i samouczków tworzonych przez użytkowników oraz większą pomocą i wsparciem za pośrednictwem narzędzi innych firm, takich jak platformy DBaaS i narzędzia analityczne, które pomogą zoptymalizować wdrożenia.
Redis jest 8. najpopularniejszą bazą danych na świecie w lutym 2021 r., według DB-Engines ze względu na swoją prostotę, bogatą strukturę danych i świetną dokumentację. Memcached znajduje się obecnie na 28. miejscu pod względem popularności bazy danych. Kiedy Redis i Memcached są uszeregowane w odniesieniu do modeli baz danych klucz-wartość, Redis zajmuje pierwsze miejsce, a Memcached zajmuje czwarte miejsce. Jeśli jednak szukasz tylko bazy danych typu klucz-wartość typu open source lub takiej, którą można wdrożyć lokalnie, Memcached zajmuje drugie miejsce, ponieważ zarówno Amazon DynamoDB, jak i Microsoft Azure Cosmos DB są komercyjnymi bazami danych, które można wdrożyć tylko w chmura.
Architektura
Redis i Memcached podążają za serwerem-klientem architektura. Klienci wypełniają dane na serwerze w postaci pary klucz-wartość.
Redis jest jednowątkowy, z drugiej strony Memcached ma wielowątkową architekturę. Memcached lepiej skaluje się w systemie z większą liczbą rdzeni, które mogą obsłużyć więcej operacji, jeśli skalowana jest pojemność obliczeniowa. Jednak w tym samym systemie można zainicjować więcej niż jedną instancję Redis, aby wykorzystać dodatkowe rdzenie.
Łatwość użytkowania
Jak wyjaśniono powyżej w sekcji Model bazy danych, Redis, będąca wielomodelową bazą danych, może być używana z dowolnym typem modelu danych. W Redis łatwo jest pisać kod, ponieważ upraszcza to złożone zadania. Redis ma zaawansowane struktury danych i nie ogranicza się do prostych wartości łańcuchowych. Na przykład, jeśli Twoja aplikacja przechowuje dane w zestawach i chcesz śledzić zestawy na liście, możesz to łatwo zrobić w Redis. Podobne zadanie na Memcached nie jest możliwe. Istnieją jednak inne sposoby wykonywania tych samych zadań, które wymagają większej liczby wierszy kodu.
Memcached, z drugiej strony, przechowuje tylko wartości zwykłego ciągu. Tak więc aplikacja musi poradzić sobie ze złożonością struktury danych.
Partycjonowanie danych
Redis obsługuje partycjonowanie danych w wielu instancjach węzłów. Obecni użytkownicy Redis wykorzystują różne techniki, takie jak partycjonowanie zakresu, partycjonowanie z haszowaniem i spójne mieszanie w celu partycjonowania danych. W Redis partycjonowanie danych można zaimplementować na trzy różne sposoby:
- Partycjonowanie po stronie klienta
- Partycjonowanie wspomagane przez proxy (przykład:twemproxy)
- Partycjonowanie po stronie serwera z routingiem zapytań w węzłach klastra
Memcached obsługuje również partycjonowanie danych w wielu węzłach, a spójne haszowanie jest zalecanym podejściem zapewniającym równomierne rozłożenie obciążenia ruchem.
Redis vs Memcached – porównanie z 2021 r.Kliknij, aby tweetowaćObsługiwane języki
Redis obsługuje prawie wszystkie najczęściej używane języki programowania, od języków wysokiego poziomu po języki niskiego poziomu. Memcached obsługuje jednak mniejszą liczbę języków w porównaniu do Redis, ale obsługuje wszystkie popularne języki.
Memcached
- .Sieć
- C
- C++
- ColdFusion
- Erlang
- Jawa
- Lisp
- Lua
- OCaml
- Perl
- PHP
- Python
- Rubin
Ponownie
- C
- C#
- C++
- Clojure
- Kryształ
- D
- Rzutki
- Eliksir
- Erlang
- Fantazyjne
- Idź
- Haskell
- Hax
- Jawa
- JavaScript (Node.js)
- Lisp
- Lua
- MatLab
- Cel-C
- OCaml
- Pascal
- Perl
- PHP
- Prolog
- Czyste dane
- Python
- R
- Buntuj się
- Rubin
- Rdza
- Scala
- Schemat
- Pogawędka
- Szybki
- Tcl
- Podstawy wizualne
Transakcje
Redis „transakcje” są wykonywane z trzema poniższymi gwarancjami:
- Transakcje są serializowane i wykonywane sekwencyjnie
- Albo wszystkie polecenia, albo żadne, są przetwarzane (transakcje atomowe)
- Optymistyczne blokowanie zapewnia dodatkową gwarancję przy użyciu funkcji „check-and-set”
Redis upewnia się, że wszystkie tylko jedno polecenie z jednego komputera klienckiego jest wykonywane jednocześnie. Wszystkie polecenia w transakcjach są wykonywane po wywołaniu polecenia „EXEC”, aby zapewnić niepodzielność.
Memcached z drugiej strony nie zapewnia zarządzania transakcjami.
Replikacja
Redis oferuje prostą replikację lider-podążający (master-slave), która tworzy dokładne kopie instancji głównych, z następującymi funkcjami:
- Master kontynuuje wysyłanie poleceń danych do slave, dopóki są one połączone.
- Jeśli połączenie zostanie zerwane, urządzenie podrzędne wykona częściową resynchronizację tylko kopiując dane, które zostały pominięte podczas rozłączenia.
- Jeśli częściowa ponowna synchronizacja nie jest możliwa, spróbuje pełnej ponownej synchronizacji.
Możesz również wykorzystać funkcje wysokiej dostępności, Redis Sentinels lub Redis Cluster, do zaawansowanej ochrony przed przełączaniem awaryjnym.
Native Memcached nie obsługuje replikacji, ale możesz użyć Repcached, bezpłatnej poprawki typu open source, aby osiągnąć wysoką dostępność we wdrożeniu. Oferuje replikację wielu wzorców, asynchroniczną replikację danych i obsługuje wszystkie polecenia Memcached.
Migawki/trwałość
Migawki to po prostu widok tylko do odczytu bazy danych w postaci, w jakiej znajdowała się w określonym momencie. Redis obsługuje migawki i domyślnie Redis zapisuje migawki zestawu danych na dysku w pliku binarnym o nazwie dump.rdb. Możesz ręcznie wywołać zrzut ekranu lub dostosować częstotliwość lub zmienić próg uruchomienia operacji.
Oto dwie opcje trwałości obsługiwane przez Redis:
- trwałość RDB
- trwałość AOF
RDB oznacza „Kopia zapasowa bazy danych Redis”. Jest to zwarta migawka bazy danych w określonym momencie w określonym czasie. Zajmuje mniej miejsca, maksymalizuje wydajność Redis i jest dobry do odzyskiwania po awarii.
AOF oznacza „Dołącz tylko plik”. AOF śledzi wszystkie wykonywane polecenia, aw katastrofalnej sytuacji ponownie wykonuje polecenia, aby odzyskać dane. Ta metoda zajmuje więcej miejsca, ponieważ wszystkie polecenia są wykonywane ponownie i nie jest bardzo trwałą metodą tworzenia migawek.
Memcached z drugiej strony nie obsługuje trwałości dysku.
Skrypty po stronie serwera
Lua to wbudowany język skryptowy dla serwera Redis, dostępny od wersji 2.6, który umożliwia wykonywanie operacji wewnątrz Redis w celu uproszczenia kodu i zwiększenia wydajności. Dwie główne funkcje używane do oceny skryptów za pomocą interpretera Lua to:
- WARTOŚĆ
- EVALSHA
Kiedy skrypt Lua jest wykonywany, wszystkie inne żądania są blokowane, jak pokazano na poniższym rysunku.
Redis zawiera również debugger skryptów Lua w wersji 3.2, który ułatwia pisanie złożonych skryptów i pomaga zwiększyć wydajność.
Memcached nie obsługuje żadnych skryptów po stronie serwera.
Skalowalność
Są dwie techniki skalowania bazy danych Redis w poziomie:
- Dodawanie odłamków w klastrach Redis
- Dodawanie węzłów do konfiguracji Redis HA (master/replika)
Możesz także skalować w pionie konfigurację Redis, gdy potrzebujesz więcej pamięci lub mocy obliczeniowej. Można to zrobić bez przestojów, jeśli masz konfigurację HA lub używasz technologii klastra Redis.
Serwer Memcached nie zapewnia mechanizmu dystrybucji danych między węzłami (sharding). Tak więc w Memcached skalowalność pozioma jest tak prosta, jak dodanie większej liczby węzłów – problem partycjonowania danych na różne fragmenty będzie musiał zostać wykonany na poziomie aplikacji/klienta. Istnieje kilka narzędzi typu open source, które mogą Ci w tym pomóc.
Protokół komunikacyjny
Redis używa TCP jako protokołu sieciowego i nie obsługuje UDP.
Memcached obsługuje zarówno protokoły komunikacyjne TCP, jak i UDP. Dane są wysyłane do serwera Memcached w dwóch formach:
- Linie tekstowe:Wysyłaj polecenia i odbieraj odpowiedzi z serwera.
- Dane nieustrukturyzowane:Odbieraj lub wysyłaj informacje o wartości dla danego klucza, a dane są zwracane w tym samym podanym formacie.
Obsługiwane zasady eksmisji pamięci podręcznej
Redis obsługuje różne rodzaje zasad eksmisji. Przyjrzyjmy się niektórym.
- noeviction: W „noeviction” błąd jest zwracany, gdy pamięć do niej dotrze.
- wszystkie klucze-lru: Lru oznacza „najmniej ostatnio używany”. Ta zasada usuwa najdawniej używane dane.
- wszystkie klucze-lfu: Lfu oznacza „najrzadziej używany”. Ta zasada usuwa najrzadziej używane dane.
- wszystkie klucze-losowe: Ta zasada usuwa dane losowo.
- lotne-lru: Dane nietrwałe są z zestawem danych wygaśnięcia. Ta zasada usuwa najdawniej używane dane nietrwałe.
- ulotne-lfu: Dane nietrwałe są z zestawem danych wygaśnięcia. Ta zasada usuwa najrzadziej używane dane lotne.
- ulotne-losowe: Ta zasada losowo usuwa ulotne dane.
- volatile-ttl: „TTL” oznacza czas życia. Ta zasada usuwa dane, które mają najkrótszy czas życia.
Memcached używa algorytmu LRU do eksmisji danych, gdy wymagane jest miejsce. Najpierw wyszukuje już wygasłe dane do usunięcia, jeśli wygasłe dane nie są dostępne, używany jest algorytm LRU.
Publikuj i subskrybuj wiadomości
Redis obsługuje wiadomości Pub/Sub (publikuj i subskrybuj). Do tego celu służą trzy polecenia.
Klient używa:
- Subskrybuj
- Anuluj subskrypcję
Zasubskrybuj i wypisz się, aby otrzymywać wiadomości z określonego kanału.
Serwer używa:
- Opublikuj
Opublikowanie służy do przekazywania danych klientom.
Memcached nie obsługuje publikowania i subskrybowania wiadomości.
Obsługa strumieni
Redis obsługuje strumienie podobne do Kafki w wersji 5.0 lub nowszej przy użyciu nowej struktury danych „Strumienie Redis”. Redis Streams opiera się na koncepcji grup konsumenckich, takich jak Apache Kafka, która pozwala aplikacjom klienckim wykorzystywać wiadomości w sposób rozproszony, co ułatwia skalowanie i tworzenie systemów o wysokiej dostępności.
Memcached nie oferuje natywnej obsługi strumieni, ale istnieją narzędzia biblioteczne typu open source, takie jak Kafcache do przetwarzania strumieni z małymi opóźnieniami.
Wsparcie geoprzestrzenne
Redis ma strukturę danych zwaną indeksami geoprzestrzennymi, która przechowuje dane o długości i szerokości geograficznej lokalizacji. Możesz wykonywać różne operacje na danych geoprzestrzennych, takie jak obliczanie odległości między dwoma punktami lub znajdowanie pobliskich miejsc.
Memcached nie ma żadnych specjalnych struktur danych do obsługi danych geoprzestrzennych.
Wydajność
Porównanie wydajności między magazynami danych klucz-wartość w pamięci jest bardziej ćwiczeniem intelektualnym niż praktycznym – chyba że wdrażasz systemy na taką skalę, że staje się to interesujące, gdy środek oszczędności kosztów. Dzieje się tak, ponieważ takie sklepy są powiązane z operacjami we/wy i zwykle opóźnienie sieci może odgrywać większą rolę w postrzeganiu opóźnienia przez aplikację niż opóźnienie bazy danych.
Bardziej praktycznym aspektem wydajności jest wydajność pamięci masowej – ile danych można spakować w tej samej ilości pamięci. Nawet tutaj wewnętrzne struktury danych używane przez Redis różnią się w zależności od rozmiaru danych. Dlatego wszelkie dyskusje na temat wydajności między tymi bazami danych powinny być podejmowane z przymrużeniem oka.
Rzućmy okiem na kilka porównań przedstawionych w artykule badawczym z 2016 roku. W tym artykule autorzy eksperymentują z szeroko stosowanymi bazami danych w pamięci, aby zmierzyć ich wydajność pod względem:
- Czas potrzebny na ukończenie operacji.
- Jak efektywnie wykorzystują pamięć podczas operacji.
Wersje baz danych użyte w artykule:
Baza danych | Wersja |
---|---|
Redis | 3.0.7 |
Memcached | 1.4.14 |
Operacja zapisu
Podczas zapisywania danych, jak widać, w poniższej tabeli Memcached wykazuje wyjątkową szybkość, nawet po przekroczeniu liczby rekordów do miliona.
Obliczony czas zapisu par klucz-wartość (ms)
Liczba rekordów | ||||
---|---|---|---|---|
Baza danych | 1000 | 10 000 | 100 000 | 1,000,000 |
Redis | 34 | 214 | 1666 | 14 638 |
Memcached | 23 | 100 | 276 | 2813 |
Operacja odczytu
Czytanie danych pozostaje prawie spójne w Redis nawet dla miliona rekordów, ale w Memcached wraz ze wzrostem liczby rekordów czas również nieco się wydłuża.
Czas, jaki upłynął do odczytania wartości odpowiadającej danemu kluczowi na bazę danych (ms)
Liczba rekordów | ||||
---|---|---|---|---|
Baza danych | 1000 | 10 000 | 100 000 | 1,000,000 |
Redis | 8 | 6 | 8 | 8 |
Memcached | 9 | 14 | 14 | 30 |
Wykorzystanie pamięci
Podczas omawiania wykorzystania pamięci Redis jest zawsze najlepszy, jak widać w wynikach.
Użycie pamięci w bazach danych w pamięci do operacji zapisu (MB)
Liczba rekordów | ||||
---|---|---|---|---|
Baza danych | 1000 | 10 000 | 100 000 | 1,000,000 |
Redis | 2,5 | 3,8 | 4.3 | 62,7 |
Memcached | 5.3 | 27,2 | 211 | 264,9 |
Jak widać Redis jest lepszy niż Memcached.
Użycie pamięci w bazach danych w pamięci do operacji usuwania (MB)
Liczba rekordów | ||||
---|---|---|---|---|
Baza danych | 1000 | 10 000 | 100 000 | 1,000,000 |
Redis | 0 | 0 | 0 | 0 |
Memcached | 2.2 | 2.1 | 2.2 | 2.2 |
Zarządzane usługi/wsparcie
Większa popularność i społeczność Redis spowodowała również zapotrzebowanie na usługi zarządzane, hosting i wsparcie. Popularni dostawcy zarządzanych baz danych dla Redis™* obejmują ScaleGrid, Redis Labs, AWS Elasticache, Azure Cache i DigitalOcean. Ta strona zawiera świetne porównanie najlepszych dostawców usługi Redis™. Redis ma również rozbudowane narzędzia do raportowania wewnętrznego, takie jak trafienia w pamięć podręczną, użycie pamięci, operacje, a nawet rejestrowanie powolnych zapytań.
Usługi zarządzane dla Memcached są znacznie mniej dostępne, ale nadal są obsługiwane przez Amazon Elasticache.
Obsługa Transport Layer Security (TLS)
Redis ma natywną obsługę TLS od wersji 6.0. Wcześniejsze wersje Redis zalecały korzystanie z programu stunnel w celu zapewnienia obsługi TLS.
Memcached 1.5.13 i nowsze wersje obsługują uwierzytelnianie i szyfrowanie przez TLS. Ta funkcja jest wciąż w fazie eksperymentalnej.
Uwierzytelnianie
Do Redis 5.x Redis obsługiwał tylko proste uwierzytelnianie oparte na haśle. To hasło było przechowywane na serwerze w postaci zwykłego tekstu. Redis w wersji 6.0 i nowszych obsługuje w pełni funkcjonalną listę ACL.
Memcached w wersji 1.4.3 i nowszych obsługuje SASL. Wcześniej Memcached nie miał warstwy uwierzytelniania.
Podsumowanie
Redis i Memcached są świetne i mają zastosowanie w różnych obszarach. Redis jest rozwijany później, ma wiele zaawansowanych funkcji i ma świetną dokumentację i społeczność.
|
*Redis jest znakiem towarowym Redis Labs Ltd. Wszelkie prawa w tym zakresie są zastrzeżone dla Redis Labs Ltd. Jakiekolwiek użycie przez ScaleGrid służy wyłącznie do celów referencyjnych i nie wskazuje na sponsorowanie, poparcie lub powiązanie między Redis i ScaleGrid.