Memcached vs. Redis?


1466

Do buforowania używamy aplikacji internetowej Ruby z serwerem Redis . Czy zamiast tego warto przetestować Memcached ?

Co zapewni nam lepszą wydajność? Jakieś zalety lub wady między Redis a Memcached?

Należy wziąć pod uwagę:

  • Prędkość odczytu / zapisu.
  • Zużycie pamięci.
  • Zrzut dyskowych operacji we / wy.
  • Skalowanie.

38
Kolejna analiza oprócz poniższych komentarzy: Google Trends: redis vs. memcached
MarkHu

3
Jeden komentarz, który nie gwarantuje odpowiedzi: jeśli patrzysz na usługi oparte na chmurze dla tych dwóch systemów (np. Dodatki do heroku) Usługi memcached są czasami nieco tańsze na MB z jakiegokolwiek powodu.
Ben Roberts,

Odpowiedzi:


2103

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.

Trwałość

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.

Ciągi ( polecenia )

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 ( polecenia )

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 ( polecenia )

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 ( polecenia )

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.


11
W jaki sposób Memcached oferuje klastrowanie w sposób, który istnieje na samym serwerze? Zawsze korzystałem z bibliotek dystrybuowanych do puli serwerów memcached przy użyciu algorytmów mieszających lub modułu. To samo mówi się o Redis. Najczęściej używam Pythona i wydaje się, że istnieje całkiem sporo modułów, które nie polegają na bibliotece memcached do obsługi pul połączeń.
whardier

2
„Transakcje z optymistycznym blokowaniem (WATCH / MULTI / EXEC)” - Redis nie ma odpowiednich transakcji. To znaczy, jeśli [multi, cmd1, cmd2, cmd3 (wyjątek), exec], to cmd1 i cmd2 zostaną wykonane.
Oleg

10
@Oleg, co nie jest prawdą. Jeśli używasz multi-exec, polecenia są buforowane (tzn .: nie wykonywane) aż do wystąpienia exec, więc jeśli masz wyjątek przed exec, wówczas żadne polecenia nie są w rzeczywistości wykonywane. Jeśli wywoływane jest exec, wszystkie buforowane polecenia są wykonywane atomowo, chyba że zmienna obserwacyjna została zmieniona od czasu pierwszego wywołania multi. Ten ostatni mechanizm jest optymistyczną częścią blokującą.
Carl Zulauf

3
@whardier Masz rację. Zaktualizowana odpowiedź w celu odzwierciedlenia „wsparcia” klastra Memcached jest włączona przez dodatkowe narzędzia. Powinienem był to lepiej zbadać.
Carl Zulauf

3
co powiesz na klastrowanie z serwerem couchbase? (kompatybilny memcached)
Ken Liu

142

Użyj Redis, jeśli

  1. Wymagane jest selektywne usuwanie / wygasanie elementów w pamięci podręcznej. (Potrzebujesz tego)

  2. Wymagana jest możliwość zapytania o klucze określonego typu. równ. „blog1: posty: *”, „blog2: kategorie: xyz: posty: *”. o tak! to jest bardzo ważne. Użyj tego, aby selektywnie unieważnić niektóre typy buforowanych elementów. Można go również użyć do unieważnienia pamięci podręcznej fragmentów, pamięci podręcznej strony, tylko obiektów AR danego typu itp.

  3. Trwałość (będzie to również potrzebne, chyba że nie masz nic przeciwko, aby pamięć podręczna musiała się rozgrzewać po każdym ponownym uruchomieniu. Bardzo ważne dla obiektów, które rzadko się zmieniają)

Użyj memcached if

  1. Memcached daje ci kłopot!
  2. umm ... klastrowanie? meh jeśli zajdziesz tak daleko, użyj Varnish i Redis do buforowania fragmentów i obiektów AR.

Z mojego doświadczenia miałem znacznie lepszą stabilność z Redis niż Memcached


7
Dokumentacja Redis mówi, że używanie wzorców wymaga skanowania tabeli. blog1: posty: * mogą wymagać skanowania tabeli O (N). Oczywiście nadal jest szybki na zestawach danych o rozsądnych rozmiarach, ponieważ Redis jest szybki. Testowanie lub administracja powinno być OK.
wisty

182
Ból głowy to żart, prawda? :-) Poszukałem wyszukiwarki memcached bez głowy, ale nie znalazłem nic sensownego. (Jestem nowy w Memcached i Redis)
KajMagnus

11
głosowali w dół z tego samego powodu, niż @pellucide. Redis może być lepszy niż Memcached, ale Memcached jest prosty w użyciu. Nigdy nie miałem z tym problemu i konfiguracja jest banalna.
Diego Jancic,

5
Dziękuję @KajMagnus za zrobienie mojego dnia .. być może cały tydzień 😂
Alex

@DiegoJancic Redis to jedna z najłatwiejszych technologii. Bez wcześniejszej wiedzy Redis zajęło mi tylko 20 minut, aby zainstalować go na Ubuntu za pomocą menedżera pakietów w chmurze i zacząć tworzyć proste zapytania. 4 godziny później mogłem POC'ować bardziej złożone scenariusze z wstawkami wsadowymi, używając skryptu Lua i wybierając odpowiednią bibliotekę Java (NIO) w celu poprawy wydajności. Nie mogę sobie wyobrazić nic bardziej przyjaznego i prostszego w użyciu niż Redis.
Łoś na wolności

105

Memcached jest wielowątkowy i szybki.

Redis ma wiele funkcji i jest bardzo szybki, ale całkowicie ograniczony do jednego rdzenia, ponieważ opiera się na pętli zdarzeń.

Używamy obu. Memcached służy do buforowania obiektów, przede wszystkim zmniejszając obciążenie odczytu baz danych. Redis jest używany do takich rzeczy jak posortowane zestawy, które są przydatne do zwijania danych szeregów czasowych.


2
Witryny o dużym natężeniu ruchu, które są mocno zainwestowane w memcached i mają wąskie gardła db w „profilach użytkowników” - nierelacyjne dane powinny oceniać couchbase równolegle ze zwykłym Mongo, Redis

2
@siliconrockstar - całkiem pewne, że Redis 3 wciąż jest jednym rdzeniem; przynajmniej AWS Redis (który używa 3.2.6 lub 3.2.10) ostrzega, aby wziąć to pod uwagę, patrząc np. na dane EngineCpuUtilization Metrics
dwanderson

1
Wygląda na to, że masz rację. Myślę, że kiedy napisałem ten komentarz, opierałem go na niekompletnych źródłach. Usunięty komentarz.
siliconrockstar

ale nadal możesz uruchomić instancje Redis $ core_count
Imaskar

2
Redis jest bardzo skoncentrowany na wydajności - więc musisz zadać sobie pytanie, dlaczego grupa inteligentnych programistów zdecydowała się zachować jedność wątków? Z dokumentów redis „Nie jest zbyt często, aby procesor stał się wąskim gardłem w Redis, ponieważ zwykle Redis jest związany z pamięcią lub siecią”. Jeśli miałbyś użyć cholernego serwera, który był związany z procesorem, prawdopodobnie masz wielu użytkowników i powinieneś mieć wiele redundantnych serwerów. Jeśli chcesz zmaksymalizować wiele procesorów na jednym serwerze, użyj partycjonowania. Przeczytaj: redis.io/topics/…
robocat

91

Jest to zbyt długo, aby można było zamieścić je jako komentarz do już zaakceptowanej odpowiedzi, dlatego umieszczam je jako osobną odpowiedź

Jedną rzeczą do rozważenia jest to, czy spodziewasz się twardego górnego limitu pamięci dla instancji pamięci podręcznej.

Ponieważ redis jest bazą danych nosql z mnóstwem funkcji, a buforowanie jest tylko jedną z opcji, z której można skorzystać, przydziela pamięć tak, jak jej potrzebuje - im więcej obiektów w niej umieścisz, tym więcej pamięci zużywa. Ta maxmemoryopcja nie wymusza użycia górnego limitu pamięci. Podczas pracy z pamięcią podręczną klucze są eksmitowane i wygasają; są szanse, że twoje klucze nie są tego samego rozmiaru, więc występuje fragmentacja pamięci wewnętrznej.

Domyślnie redis używa jemalloc alokatora pamięci, który stara się być zarówno kompaktowy, jak i szybki, ale jest to alokator pamięci ogólnego przeznaczenia i nie może nadążyć za dużą ilością alokacji i czyszczenia obiektów. Z tego powodu w przypadku niektórych wzorców obciążenia proces redis może najwyraźniej przeciekać pamięć z powodu wewnętrznej fragmentacji. Na przykład, jeśli masz serwer z 7 Gb RAM i chcesz użyć redis jako nietrwałej pamięci podręcznej LRU, może się okazać, że proces redis z maxmemoryustawioną wartością 5 Gb z czasem zużywałby coraz więcej pamięci, ostatecznie osiągając całkowity limit pamięci RAM do zabójca z pamięci przeszkadza.

memcached lepiej pasuje do opisanego powyżej scenariusza, ponieważ zarządza pamięcią w zupełnie inny sposób. memcached przydziela jeden duży fragment pamięci - wszystko, czego kiedykolwiek będzie potrzebował - a następnie samodzielnie zarządza tą pamięcią, używając własnego zaimplementowanego alokatora płyt . Co więcej, Memcached stara się utrzymać niską fragmentację wewnętrzną, ponieważ faktycznie używa algorytmu LRU dla płyty , gdy eksmisje LRU są wykonywane z uwzględnieniem wielkości obiektu.

Mając to na uwadze, memcached nadal ma silną pozycję w środowiskach, w których użycie pamięci musi być wymuszone i / lub przewidywalne. Próbowaliśmy użyć najnowszej stabilnej wersji redis (2.8.19) jako nietrwałego zastępowania pamięci podręcznej opartej na LRU przy obciążeniu 10-15k operacji / s, i to wyciekło DUŻO pamięci; to samo obciążenie spowodowało awarię wystąpień redis ElastiCache Amazon w ciągu około jednego dnia z tych samych powodów.


2
Od redis.io/topics/faq : Redis ma wbudowane zabezpieczenia pozwalające użytkownikowi ustawić maksymalny limit wykorzystania pamięci, używając opcji maxmemory w pliku konfiguracyjnym, aby ograniczyć limit pamięci, z którego Redis może korzystać. Po osiągnięciu tego limitu Redis zacznie odpowiadać z błędem zapisu poleceń (ale nadal będzie akceptować polecenia tylko do odczytu) lub możesz go skonfigurować, aby eksmitował klucze po osiągnięciu maksymalnego limitu pamięci w przypadku korzystania z Redis do buforowania. Mamy dokumentację, jeśli planujesz używać Redis jako pamięci podręcznej LRU. link
StefanNch

8
Opcja @StefanNch redis maxmemorynie uwzględnia fragmentacji pamięci wewnętrznej. Proszę zobaczyć mój komentarz powyżej, aby uzyskać szczegółowe informacje - problemy, które tam opisałem, były widoczne w scenariuszu opisanym na stronie „Redis as a LRU cache” z włączonymi opcjami ograniczania pamięci. Z drugiej strony memcached stosuje inne podejście, aby uniknąć problemu fragmentacji pamięci, więc jego limit pamięci jest znacznie bardziej „trudny”.
artyom

46

Memcached jest dobry w byciu prostym magazynem kluczy / wartości i jest dobry w robieniu key => STRING. To sprawia, że ​​naprawdę dobrze nadaje się do przechowywania sesji.

Redis jest dobry w robieniu klucza => SOME_OBJECT.

To naprawdę zależy od tego, co zamierzasz tam umieścić. Rozumiem, że pod względem wydajności są one dość równe.

Powodzenia w znalezieniu obiektywnych testów porównawczych, jeśli znajdziesz jakieś miłe, wyślij je mi na swój sposób.


2
IMO typu danych Redis Hash ma o wiele większy sens do przechowywania zmiennych sesji niż szeregowania ich w zapisany ciąg.
Carl Zulauf,

6
Jeśli zależy Ci na zadowoleniu użytkowników, nie umieszczaj sesji w pamięci podręcznej. dormando.livejournal.com/495593.html
sleblanc

4
@sebleblanc Teoretycznie nie powinno to stanowić problemu w Redis, ponieważ istnieje również trwałość dysku.
haknick

2
@sebleblanc memcache jest nadal dobry do przechowywania sesji, źle go wdrażasz lub nie. tak, eksmisja jest problemem, ale w żadnym wypadku nie do pokonania, nie jest też problemem memcache, jeśli nie martwisz się eksmisją. Większość rozwiązań sesji memcache wykorzystuje pliki cookie jako kopię zapasową.
Erik Petersen,

11
„Nie umieszczaj swoich sesji w pamięci podręcznej” jest mylące. Masz na myśli „Nie przechowuj tylko sesji w pamięci podręcznej”. Każdy, kto przechowuje ważne dane tylko w memcache, powinien zostać natychmiast zwolniony.
Jacob

37

Jeśli nie masz nic przeciwko prostemu stylowi pisania, warto przeczytać Redis vs. Memcached na blogu Systoilet z punktu widzenia użyteczności, ale pamiętaj, aby przeczytać komentarze w przód iw tył przed wyciągnięciem jakichkolwiek wniosków na temat wydajności; istnieją pewne problemy metodologiczne (jednowątkowe testy pętli zajętości), a Redis wprowadził pewne ulepszenia od czasu napisania tego artykułu.

Żadne łącze do testu porównawczego nie jest kompletne bez nieco mylących rzeczy, więc sprawdź także niektóre sprzeczne testy porównawcze na LiveJournal Dormondo i na blogu Antirez .

Edycja - jak zauważa Antirez, analiza Systoilet jest raczej źle pomyślana. Nawet poza brakiem jednowątkowym znaczną różnicę wydajności w tych testach porównawczych można przypisać bibliotekom klienta, a nie przepustowości serwera. Testy porównawcze na blogu Antirez rzeczywiście przedstawiają znacznie więcej porównań jabłek z jabłkami (z tymi samymi ustami).



28
Nie żartowałeś z crassu.
ocodo

1
Więcej na temat jego przestarzałego bloga z 2010 roku
Siddharth,

24

Mam możliwość używania zarówno memcached, jak i redis razem w proxy buforowania, nad którym pracowałem, pozwól, że podzielę się z Tobą, gdzie dokładnie użyłem tego, co i powód tego samego ....

Redis>

1) Służy do indeksowania zawartości pamięci podręcznej w klastrze. Mam ponad miliard kluczy rozmieszczonych w klastrach redis, czasy odpowiedzi redis są znacznie mniejsze i stabilne.

2) Zasadniczo jest to magazyn kluczy / wartości, więc gdziekolwiek w twojej aplikacji masz coś podobnego, możesz używać redis z kłopotami.

3) Trwałość Redis, przełączanie awaryjne i tworzenie kopii zapasowych (AOF) ułatwi Ci pracę.

Pamięć podręczna>

1) tak, zoptymalizowana pamięć, którą można wykorzystać jako pamięć podręczną. Użyłem go do przechowywania bardzo często dostępnej zawartości pamięci podręcznej (50 trafień na sekundę) o rozmiarze mniejszym niż 1 MB.

2) Przydzieliłem tylko 2 GB z 16 GB pamięci memcached, gdy mój pojedynczy rozmiar zawartości wynosił> 1 MB.

3) Ponieważ zawartość rośnie w pobliżu limitów, od czasu do czasu obserwuję wyższe czasy odpowiedzi w statystykach (nie w przypadku redis).

Jeśli poprosisz o ogólne doświadczenie, Redis jest bardziej zielony, ponieważ jest łatwy w konfiguracji, bardzo elastyczny ze stabilnymi, solidnymi funkcjami.

Ponadto pod tym linkiem dostępny jest wynik testu porównawczego , poniżej kilka wyróżnień od tego samego,

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Mam nadzieję że to pomoże!!


14

Test. Przeprowadź kilka prostych testów porównawczych. Przez długi czas uważałem się za nosorożca oldschoolowego, ponieważ używałem głównie memcached i uważałem Redis za nowe dziecko.

W mojej obecnej firmie Redis był używany jako główna pamięć podręczna. Kiedy zagłębiłem się w statystyki wydajności i po prostu zacząłem testować, Redis był pod względem wydajności porównywalny lub minimalnie wolniejszy niż MySQL.

Zanurzone, choć uproszczone, całkowicie wyrzuciło Redis z wody . Skalował się znacznie lepiej:

  • dla większych wartości (wymagana zmiana rozmiaru płyty, ale działała)
  • dla wielu jednoczesnych żądań

Moim zdaniem, polityka eksmisji memcached jest znacznie lepiej zaimplementowana, co skutkuje ogólnie bardziej stabilnym średnim czasem reakcji przy obsłudze większej ilości danych niż pamięć podręczna może obsłużyć.

Niektóre testy porównawcze ujawniły, że Redis w naszym przypadku działa bardzo słabo. Myślę, że ma to związek z wieloma zmiennymi:

  • rodzaj sprzętu, na którym uruchamiasz Redis
  • rodzaje przechowywanych danych
  • ilość pobrań i zestawów
  • jak równoczesna jest twoja aplikacja
  • czy potrzebujesz struktury przechowywania danych

Osobiście nie podzielam poglądu autorów Redis na temat współbieżności i wielowątkowości.


wyjaśnij „minimalnie wolniej niż MySQL”.
Anirudha Gupta

Trzeba powiedzieć, że nie mam pod ręką tych danych porównawczych, ale w tym konkretnym przypadku było dużo operacji odczytu / zapisu
mdomans

13

Kolejną zaletą jest to, że może być bardzo jasne, jak zachowa się pamięć podręczna w scenariuszu buforowania, podczas gdy redis jest zwykle używany jako trwały magazyn danych, chociaż można go skonfigurować tak, aby zachowywał się tak, jakby zachowywał się w pamięci, czyli eksmituje Najmniej ostatnio używane elementy, gdy osiągnie maksimum Pojemność.

Niektóre aplikacje, nad którymi pracowałem, używają obu, aby wyjaśnić, w jaki sposób zamierzamy zachowywać dane - rzeczy w memcache, piszemy kod, aby obsłużyć przypadki, w których ich nie ma - rzeczy w redis, polegamy na tym, że tam są .

Poza tym Redis jest ogólnie uważany za lepszy w większości przypadków użycia, ponieważ jest bardziej bogaty w funkcje, a zatem elastyczny.


10

Nie byłoby źle, jeśli powiemy, że redis jest kombinacją (pamięć podręczna + struktura danych), a memcached to tylko pamięć podręczna.


1
to dobra odpowiedź - Laravel używa redis jako pamięci podręcznej i mechanizmu przechowywania danych
Miroslav Trninic

8

Bardzo prosty test do ustawienia i uzyskania 100k unikalnych kluczy i wartości w stosunku do redis-2.2.2 i memcached. Oba działają na systemie Linux Linux (CentOS), a mój kod klienta (wklejony poniżej) działa na pulpicie systemu Windows.

Redis

  • Czas potrzebny do zapisania wartości 100000 wynosi = 18954 ms

  • Czas potrzebny do załadowania wartości 100000 wynosi = 18328 ms

Memcached

  • Czas potrzebny do zapamiętania wartości 100000 wynosi = 797 ms

  • Czas potrzebny na pobranie 100000 wartości wynosi = 38984 ms


Jedis jed = new Jedis("localhost", 6379);
int count = 100000;
long startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  jed.set("u112-"+i, "v51"+i);
}
long endTime = System.currentTimeMillis();
System.out.println("Time taken to store "+ count + " values is ="+(endTime-startTime)+"ms");

startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  client.get("u112-"+i);
}
endTime = System.currentTimeMillis();
System.out.println("Time taken to retrieve "+ count + " values is ="+(endTime-startTime)+"ms");

6
Ponieważ oczywiście używałeś Javy do pomiaru ... czy „rozgrzałeś” swoje przypadki testowe? Jest to niezbędne, aby zmierzyć tak krótki czas ... że JIT skompilował gorące punkty.
cljk

7

Jedną z głównych różnic, o której nie wspomniano tutaj, jest to, że Memcache ma zawsze górny limit pamięci, podczas gdy Redis domyślnie nie (ale można to skonfigurować). Jeśli zawsze chciałbyś przechowywać klucz / wartość przez określony czas (i nigdy nie eksmitować go z powodu małej ilości pamięci), powinieneś skorzystać z Redis. Oczywiście ryzykujesz także brak pamięci ...


6

Największym pozostałym powodem jest specjalizacja.

Redis może robić wiele różnych rzeczy, a jednym z efektów ubocznych jest to, że programiści mogą zacząć korzystać z wielu różnych zestawów funkcji w tej samej instancji. Jeśli używasz funkcji LRU w Redis do buforowania pamięci podręcznej obok twardego dysku, który NIE jest LRU, można całkowicie zabraknąć pamięci.

Jeśli zamierzasz skonfigurować dedykowaną instancję Redis, która będzie używana TYLKO jako instancja LRU, aby uniknąć tego konkretnego scenariusza, to tak naprawdę nie ma żadnego istotnego powodu, aby używać Redis zamiast Memcached.

Jeśli potrzebujesz niezawodnej pamięci podręcznej LRU „nigdy nie spada” ... Memcached zmieści się w rachunkach, ponieważ nie jest w stanie zabraknąć pamięci według projektu, a specjalna funkcja uniemożliwia programistom próbowanie uczynienia go tak, aby mogło to zagrozić. Prosty podział problemów.


6

Memcached będzie szybszy, jeśli jesteś zainteresowany wydajnością, nawet dlatego, że Redis wymaga sieci (połączenia TCP). Również wewnętrznie Memcache jest szybszy.

Redis ma więcej funkcji, jak wspomniano w innych odpowiedziach.


6

Myśleliśmy o Redis jako o odciążeniu naszego projektu w pracy. Myśleliśmy, że używając modułu w nginxnazwie HttpRedis2Modulelub czegoś podobnego będziemy mieć niesamowitą prędkość, ale podczas testowania za pomocą testu AB okazało się, że się mylimy.

Być może moduł był zły lub nasz układ, ale było to bardzo proste zadanie i jeszcze szybciej było pobrać dane z php, a następnie włożyć je do MongoDB. Używamy APC jako systemu buforowania, z tym php i MongoDB. To było znacznie szybsze niż nginxmoduł Redis.

Moja rada to przetestowanie go samemu, ponieważ spowoduje to wyświetlenie wyników dla twojego środowiska. Uznaliśmy, że korzystanie z Redis było niepotrzebne w naszym projekcie, ponieważ nie miałoby to sensu.


Ciekawa odpowiedź, ale nie jestem pewien, czy pomoże OP
Scott Schulthess,

Wstawianie do Redis i używanie go jako pamięci podręcznej było wolniejsze niż przy użyciu APC + PHP + MongoDB. Ale samo wstawienie do Redis było DUŻO wolniejsze niż wstawienie bezpośrednio do MongoDB. Bez APC myślę, że są całkiem równi.
Ms01,

2
To dlatego Mongo nie daje żadnej gwarancji, że to co zostało wstawione jest kiedykolwiek będzie zapisywana na dysku ...
Damian

21
ale jest to webscale, mongodb będzie biegał wokół ciebie w kółko podczas pisania. Obecnie piszę tylko do / dev / null, ponieważ jest to najszybszy.
Ms01,

1

Redis jest lepszy.

Zaletami Redis

  1. Ma wiele opcji przechowywania danych, takich jak ciąg, zestawy, zestawy posortowane, skróty, mapy bitowe
  2. Dysk Trwałość zapisów
  3. Obsługa procedur przechowywanych ( LUAskryptów)
  4. Może działać jako broker komunikatów za pomocą PUB / SUB

Natomiast Memcachejest systemem typu pamięci podręcznej wartości klucza w pamięci.

  1. Brak obsługi różnych typów danych, takich jak listy, zestawy jak w redis.
  2. Główną wadą jest to, że Memcache nie ma trwałości dysku.

0

Cóż, najczęściej używałem zarówno z aplikacjami, Memcache do buforowania sesji i redis do obiektów zapytań doktryn / orm. Pod względem wydajności oba są prawie takie same.


0

Oto naprawdę świetny artykuł / różnice dostarczone przez Amazon

Redis jest wyraźnym zwycięzcą w porównaniu z memcached.

Tylko jeden plus dla Memcached Jest wielowątkowy i szybki. Redis ma wiele świetnych funkcji i jest bardzo szybki, ale ograniczony do jednego rdzenia.

Świetne punkty na temat Redis, które nie są obsługiwane w Memcached

  • Migawki - użytkownik może zrobić migawkę pamięci podręcznej Redis i zachować ją na dodatkowej pamięci w dowolnym momencie.
  • Wbudowana obsługa wielu struktur danych, takich jak Set, Map, SortedSet, List, BitMaps itp.
  • Obsługa skryptów Lua w Redis
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.