Podsumowanie (TL; DR)
Zaktualizowano 3 czerwca 2017 r
Redis jest potężniejszy, bardziej popularny i lepiej obsługiwany niż memcached. Memcached może zrobić tylko niewielką część rzeczy, które może zrobić Redis. Redis jest lepszy nawet tam, gdzie ich funkcje się pokrywają.
Aby uzyskać coś nowego, użyj Redis.
Memcached vs Redis: bezpośrednie porównanie
Oba narzędzia są potężnymi, szybkimi magazynami danych w pamięci, które są przydatne jako pamięć podręczna. Oba mogą przyspieszyć działanie aplikacji, buforując wyniki bazy danych, fragmenty HTML lub cokolwiek innego, co może być kosztowne w generowaniu.
Należy wziąć pod uwagę
W przypadku użycia tej samej rzeczy, oto jak porównują, używając oryginalnego pytania „Punkty do rozważenia”:
- Prędkość odczytu / zapisu : oba są bardzo szybkie. Testy porównawcze różnią się w zależności od obciążenia, wersji i wielu innych czynników, ale ogólnie pokazują, że redis jest tak szybki lub prawie tak szybki, jak zapisany w pamięci. Polecam redis, ale nie dlatego, że memcached działa wolno. To nie jest.
- Wykorzystanie pamięci : Redis jest lepszy.
- memcached: określasz rozmiar pamięci podręcznej i podczas wstawiania elementów demon szybko rośnie do nieco więcej niż tego rozmiaru. Tak naprawdę nigdy nie ma sposobu na odzyskanie tego miejsca bez ponownego uruchomienia memcached. Wszystkie twoje klucze mogą wygasnąć, możesz opróżnić bazę danych, i nadal wykorzysta pełny fragment pamięci RAM, z którą ją skonfigurowałeś.
- redis: Ustawienie maksymalnego rozmiaru zależy od Ciebie. Redis nigdy nie zużyje więcej niż musi i zapewni ci pamięć, której już nie używa.
- W obu zapisałem 100 000 ~ 2 KB ciągów (~ 200 MB) losowych zdań. Zużycie pamięci RAM wzrosło do ~ 225 MB. Redis użycie pamięci RAM wzrosło do ~ 228 MB. Po przepłukaniu obu, redis spadł do ~ 29 MB, a memcached pozostał na ~ 225 MB. Są podobnie wydajne w sposobie przechowywania danych, ale tylko jeden jest w stanie je odzyskać.
- Zrzut dyskowych operacji we / wy : Wyraźna wygrana dla redis, ponieważ robi to domyślnie i ma bardzo konfigurowalną trwałość. Memcached nie ma mechanizmów zrzutu na dysk bez narzędzi innych firm.
- Skalowanie : oba zapewniają mnóstwo miejsca, zanim potrzebujesz więcej niż jednej instancji jako pamięci podręcznej. Redis zawiera narzędzia, które pomogą ci wyjść poza to, gdy memcached tego nie robi.
memcached
Memcached to prosty, zmienny serwer pamięci podręcznej. Pozwala przechowywać pary klucz / wartość, w których wartość jest ograniczona do bycia ciągiem do 1 MB.
Jest w tym dobry, ale to wszystko. Możesz uzyskać dostęp do tych wartości według klucza z bardzo dużą prędkością, często nasycając dostępną przepustowość sieci, a nawet pamięci.
Po ponownym uruchomieniu memcached twoje dane zniknęły. To jest dobre dla pamięci podręcznej. Nie powinieneś przechowywać tam niczego ważnego.
Jeśli potrzebujesz wysokiej wydajności lub wysokiej dostępności, dostępne są narzędzia, produkty i usługi innych firm.
redis
Redis może wykonywać te same zadania, co memcached, i może wykonywać je lepiej.
Redis może również działać jako pamięć podręczna . Może także przechowywać pary klucz / wartość. W redis mogą nawet wynosić do 512 MB.
Możesz wyłączyć uporczywość, a szczęśliwie utraci dane również przy ponownym uruchomieniu. Jeśli chcesz, aby pamięć podręczna przetrwała, uruchomi się ponownie. W rzeczywistości jest to ustawienie domyślne.
Jest również super szybki, często ograniczony przepustowością sieci lub pamięci.
Jeśli jedno wystąpienie funkcji redis / memcached nie jest wystarczające do obciążenia, redis jest oczywistym wyborem. Redis obejmuje obsługę klastrów i jest wyposażony w narzędzia wysokiej dostępności ( redis-sentinel ) bezpośrednio „w pudełku”. W ciągu ostatnich kilku lat redis stało się również wyraźnym liderem w dziedzinie narzędzi zewnętrznych. Firmy takie jak Redis Labs, Amazon i inne oferują wiele przydatnych narzędzi i usług redis. Ekosystem wokół Redis jest znacznie większy. Liczba wdrożeń na dużą skalę jest teraz prawdopodobnie większa niż w przypadku memcached.
The Redis Superset
Redis to coś więcej niż pamięć podręczna. Jest to serwer struktury danych w pamięci. Poniżej znajdziesz szybki przegląd rzeczy, które Redis może zrobić poza zwykłą pamięcią podręczną klucza / wartości, taką jak memcached. Większość funkcji redis to rzeczy, których memcached nie może zrobić.
Dokumentacja
Redis jest lepiej udokumentowany niż zapisany w pamięci. Chociaż może to być subiektywne, wydaje się być coraz bardziej prawdziwe przez cały czas.
redis.io to fantastyczny, łatwy w obsłudze zasób. Pozwala wypróbować redis w przeglądarce, a nawet daje interaktywne przykłady na żywo z każdym poleceniem w dokumentacji.
Istnieje teraz 2x więcej wyników przepełnienia stosu dla redis niż memcached. 2x więcej wyników Google. Łatwiej dostępne przykłady w większej liczbie języków. Bardziej aktywny rozwój. Bardziej aktywny rozwój klienta. Pomiary te mogą nie oznaczać wiele indywidualnie, ale w połączeniu dają wyraźny obraz, że wsparcie i dokumentacja dla redis jest większa i znacznie bardziej aktualna.
Domyślnie redis utrzymuje dane na dysku za pomocą mechanizmu zwanego snapshottingiem. Jeśli masz wystarczającą ilość dostępnej pamięci RAM, jest w stanie zapisać wszystkie dane na dysku, prawie bez obniżenia wydajności. To prawie za darmo!
W trybie migawkowym istnieje szansa, że nagłe zawieszenie może spowodować utratę niewielkiej ilości danych. Jeśli absolutnie potrzebujesz się upewnić, że żadne dane nigdy nie zostaną utracone, nie martw się, redis też ma Cię w tym trybie AOF (Append Only File). W tym trybie trwałości dane mogą być synchronizowane z dyskiem podczas zapisywania. Może to zmniejszyć maksymalną przepustowość zapisu do prędkości, z jaką dysk może zapisywać, ale nadal powinno być dość szybkie.
W razie potrzeby istnieje wiele opcji konfiguracji, które pozwalają dostroić trwałość, ale wartości domyślne są bardzo rozsądne. Te opcje ułatwiają skonfigurowanie redis jako bezpiecznego, nadmiarowego miejsca do przechowywania danych. To prawdziwa baza danych.
Wiele typów danych
Memcached jest ograniczony do ciągów, ale Redis jest serwerem struktury danych, który może obsługiwać wiele różnych typów danych. Udostępnia także polecenia potrzebne do maksymalnego wykorzystania tych typów danych.
Prosty tekst lub wartości binarne, które mogą mieć maksymalnie 512 MB. Jest to jedyny typ danych redis i udział memcached, choć łańcuchy memcached są ograniczone do 1 MB.
Redis oferuje więcej narzędzi do wykorzystania tego typu danych, oferując polecenia do operacji bitowych, manipulacji na poziomie bitów, obsługi inkrementacji / dekrementacji zmiennoprzecinkowej, zapytań o zakres i operacji na wielu klawiszach. Memcached nie obsługuje żadnej z tych funkcji.
Ciągi są przydatne we wszelkiego rodzaju przypadkach użycia, dlatego memcached jest dość użyteczny tylko w przypadku tego typu danych.
Hashe są jak magazyn wartości klucza w magazynie wartości klucza. Mapują między polami ciągów i wartościami ciągów. Mapy pola> wartości za pomocą skrótu zajmują niewiele więcej miejsca niż mapy klucza> wartości za pomocą zwykłych ciągów.
Skróty są przydatne jako przestrzeń nazw lub gdy chcesz logicznie pogrupować wiele kluczy. Za pomocą skrótu możesz efektywnie chwytać wszystkich członków, wygasać wszystkich członków razem, usuwać wszystkich członków razem itp. Idealne do każdego przypadku użycia, w którym masz kilka par klucz / wartość, które trzeba zgrupować.
Jednym z przykładów zastosowania skrótu jest przechowywanie profili użytkowników między aplikacjami. Skrót redis przechowywany z identyfikatorem użytkownika jako kluczem pozwala przechowywać tyle bitów danych o użytkowniku, ile jest potrzebne, przy jednoczesnym zachowaniu ich pod jednym kluczem. Zaletą używania skrótu zamiast szeregowania profilu w ciąg jest to, że różne aplikacje mogą odczytywać / zapisywać różne pola w profilu użytkownika bez konieczności martwienia się o to, że jedna aplikacja nadpisuje zmiany wprowadzone przez inne (co może się zdarzyć, jeśli serializujesz nieaktualne dane).
Listy Redis to uporządkowane zbiory ciągów. Są one zoptymalizowane do wstawiania, czytania lub usuwania wartości z góry lub dołu (czyli: z lewej lub z prawej) listy.
Redis udostępnia wiele poleceń służących do wykorzystywania list, w tym poleceń do pchania / popowania elementów, pchania / popowania między listami, obcinania list, wykonywania zapytań o zakres itp.
Listy tworzą świetne, trwałe, atomowe kolejki. Działa to doskonale w przypadku kolejek zadań, dzienników, buforów i wielu innych przypadków użycia.
Zestawy to nieuporządkowane kolekcje unikalnych wartości. Są zoptymalizowane, aby umożliwić szybkie sprawdzenie, czy wartość znajduje się w zestawie, szybkie dodawanie / usuwanie wartości oraz pomiar nakładania się z innymi zestawami.
Są idealne do takich rzeczy, jak listy kontroli dostępu, unikalne narzędzia do śledzenia odwiedzających i wiele innych rzeczy. Większość języków programowania ma coś podobnego (zwykle nazywanego zestawem). Tak to jest, tylko rozpowszechniane.
Redis udostępnia kilka poleceń do zarządzania zestawami. Oczywiste są takie jak dodawanie, usuwanie i sprawdzanie zestawu. Tak więc są mniej oczywiste polecenia, takie jak popping / czytanie losowego elementu i polecenia do wykonywania związków i skrzyżowań z innymi zestawami.
Posortowane zestawy ( polecenia )
Posortowane zestawy to także kolekcje unikalnych wartości. Te, jak sama nazwa wskazuje, są uporządkowane. Są one uporządkowane według partytury, a następnie leksykograficznie.
Ten typ danych jest zoptymalizowany do szybkiego wyszukiwania według wyniku. Uzyskanie najwyższej, najniższej lub dowolnego zakresu wartości pomiędzy jest niezwykle szybkie.
Jeśli dodasz użytkowników do posortowanego zestawu wraz z ich wysokim wynikiem, masz doskonałą tabelę wyników. Gdy pojawią się nowe wysokie wyniki, po prostu dodaj je ponownie do zestawu z ich wysokim wynikiem, a to zmieni kolejność twojej tabeli liderów. Świetnie nadaje się także do śledzenia, kiedy użytkownicy odwiedzili Twoją stronę i kto jest aktywny w Twojej aplikacji.
Przechowywanie wartości z tym samym wynikiem powoduje uporządkowanie ich leksykograficznie (pomyśl alfabetycznie). Może to być przydatne w przypadku funkcji takich jak autouzupełnianie.
Wiele posortowanych zestawów poleceń jest podobnych do poleceń zestawów, czasem z dodatkowym parametrem score. Uwzględniono również polecenia do zarządzania wynikami i zapytania według wyniku.
Geo
Redis ma kilka poleceń do przechowywania, wyszukiwania i pomiaru danych geograficznych. Obejmuje to zapytania o promień i pomiar odległości między punktami.
Technicznie dane geograficzne w redis są przechowywane w posortowanych zestawach, więc nie jest to naprawdę osobny typ danych. Jest to raczej rozszerzenie nad posortowanymi zestawami.
Mapa bitowa i HyperLogLog
Podobnie jak geo, nie są to całkowicie oddzielne typy danych. Są to polecenia, które pozwalają traktować dane łańcuchowe tak, jakby to była mapa bitowa lub hiperloglog.
Bitmapy są po to, do czego służą operatorzy na poziomie bitów, o których mówiłem Strings
. Ten typ danych był podstawowym elementem składowym najnowszego projektu artystycznego reddit: r / Place .
HyperLogLog pozwala na użycie bardzo małej ilości miejsca do zliczenia niemal nieograniczonej liczby unikalnych wartości z szokującą dokładnością. Używając tylko ~ 16 KB, możesz efektywnie policzyć liczbę unikalnych odwiedzających witrynę, nawet jeśli liczba ta jest w milionach.
Transakcje i atomowość
Polecenia w redis są atomowe, co oznacza, że możesz być pewien, że jak tylko napiszesz wartość do redis, ta wartość jest widoczna dla wszystkich klientów podłączonych do redis. Nie trzeba czekać na rozpowszechnienie tej wartości. Technicznie memcached jest również atomowy, ale z redis dodającym całą tę funkcjonalność poza memcached, warto zauważyć i nieco imponujące, że wszystkie te dodatkowe typy danych i funkcje są również atomowe.
Chociaż nie do końca takie same jak transakcje w relacyjnych bazach danych, redis ma również transakcje, które wykorzystują „optymistyczne blokowanie” ( WATCH / MULTI / EXEC ).
Rurociągi
Redis udostępnia funkcję o nazwie „ potokowanie ”. Jeśli masz wiele poleceń redis, które chcesz wykonać, możesz użyć potokowania, aby wysłać je do redis naraz zamiast pojedynczo.
Zwykle po wykonaniu polecenia redis lub memcached każde polecenie jest osobnym cyklem zapytania / odpowiedzi. Dzięki potokowi redis może buforować kilka poleceń i wykonywać je wszystkie naraz, odpowiadając wszystkimi odpowiedziami na wszystkie twoje polecenia w jednej odpowiedzi.
Dzięki temu możesz osiągnąć jeszcze większą przepustowość podczas importu zbiorczego lub innych działań, które wymagają wielu poleceń.
Pub / Sub
Redis ma polecenia dedykowane do funkcji pub / sub , dzięki czemu redis może działać jako szybki nadawca wiadomości. Dzięki temu pojedynczy klient może publikować wiadomości do wielu innych klientów podłączonych do kanału.
Redis robi pub / sub, a także prawie każde narzędzie. Dedykowani brokerzy wiadomości, tacy jak RabbitMQ, mogą mieć zalety w niektórych obszarach, ale fakt, że ten sam serwer może również zapewniać trwałe trwałe kolejki i inne struktury danych, których prawdopodobnie potrzebują obciążenia pub / sub, Redis często okaże się najlepszym i najprostszym narzędziem dla pracy.
Lua Scripting
Możesz pomyśleć o skryptach lua, takich jak SQL lub procedury składowane Redis. Jest to mniej więcej to, ale analogia w większości działa.
Być może masz skomplikowane obliczenia, które chcesz wykonać ponownie. Być może nie możesz sobie pozwolić na wycofanie swoich transakcji i potrzebujesz gwarancji, że każdy etap złożonego procesu nastąpi atomowo. Te i wiele innych problemów można rozwiązać za pomocą skryptów lua.
Cały skrypt jest wykonywany atomowo, więc jeśli dopasujesz swoją logikę do skryptu lua, często unikniesz bałaganu przy optymistycznych transakcjach blokowania.
skalowanie
Jak wspomniano powyżej, redis zawiera wbudowaną obsługę klastrowania i jest pakowany z własnym narzędziem wysokiej dostępności o nazwie redis-sentinel
.
Wniosek
Bez wahania polecam redis zamiast memcached dla nowych projektów lub istniejących projektów, które jeszcze nie używają memcached.
Powyższe może brzmieć tak, jakbym nie lubił memcached. Przeciwnie: jest to potężne, proste, stabilne, dojrzałe i utwardzone narzędzie. Istnieją nawet przypadki użycia, w których jest to trochę szybsze niż redis. Uwielbiam memcached. Po prostu nie sądzę, żeby miało to sens dla przyszłego rozwoju.
Redis robi wszystko, co zapamiętano, często lepiej. Wszelkie korzyści związane z wydajnością memcached są niewielkie i zależą od obciążenia. Istnieją również obciążenia, dla których redis będzie szybszy, i wiele innych obciążeń, które może wykonać redis, których memcached po prostu nie może. Niewielkie różnice w wydajności wydają się niewielkie w obliczu ogromnej przepaści pod względem funkcjonalności, a fakt, że oba narzędzia są tak szybkie i wydajne, że równie dobrze może być ostatnim elementem infrastruktury, który będziesz musiał martwić się o skalowanie.
Jest tylko jeden scenariusz, w którym memcached ma większy sens: gdzie memcached jest już używany jako pamięć podręczna. Jeśli już buforujesz z memcached, używaj go dalej, jeśli spełnia twoje potrzeby. Przejście na redis prawdopodobnie nie jest warte wysiłku, a jeśli zamierzasz używać redis tylko do buforowania, może nie zaoferować wystarczającej korzyści, aby był wart twojego czasu. Jeśli memcached nie spełnia twoich potrzeb, prawdopodobnie powinieneś przejść do redis. Dzieje się tak niezależnie od tego, czy potrzebujesz skalować poza pamięć, czy potrzebujesz dodatkowej funkcjonalności.