Czy memcached jest dinozaurem w porównaniu z Redisem? [Zamknięte]

185

Przez ostatnie tygodnie sporo pracowałem z memcached i właśnie dowiedziałem się o Redis. Kiedy przeczytałem tę część ich pliku readme, nagle poczułem ciepło i przytulnie w żołądku:

Redis może być używany jako memcached na sterydach, ponieważ jest tak szybki jak memcached, ale ma wiele innych funkcji. Podobnie jak memcached, Redis obsługuje również ustawianie limitów czasu dla kluczy, dzięki czemu ten klucz zostanie automatycznie usunięty po upływie określonego czasu.

Brzmi niesamowicie. Znalazłem również tę stronę z testami porównawczymi: http://www.ruturaj.net/redis-memcached-tokyo-tyrant-mysql-comparison

Więc szczerze - czy memcache to naprawdę ten stary dinousaur, który jest złym wyborem z punktu widzenia wydajności w porównaniu do tego nowicjusza o imieniu Redis?

Wcześniej nie słyszałem wiele o Redis, a więc podejście do mojego pytania!

Przemysłowy
źródło
9
Benchmark ruturaj nie jest tak naprawdę wart uwagi
dsomnus
2
Zaczęliśmy eksperymentować z Membase w pracy i jak dotąd jesteśmy szczęśliwi. Chociaż pochodzimy z Memcache, więc spadek wymiany był miłym plusem: membase.org
jayshao
2
Redis jest tak szybki, jak memcached dla nierealistycznych testów porównawczych. Nie oznacza to, że jest powolny - z pewnością jest wystarczająco szybki dla większości obciążeń, ale rzeczy szybsze niż memcached ujawniają tylko błędy w memcached. Prawie zawsze jest wąskie gardło ze względu na sprzęt lub kiepski projekt aplikacji.
Dustin
4
Dziwi mnie, że patrol świętości SO nie zamknął tego pytania jako niewłaściwe i nie pomocne.
Dogweather

Odpowiedzi:

74

Memcache to wciąż doskonałe narzędzie i BARDZO niezawodny.

zamiast patrzeć na ten problem z perspektywy, która jest szybsza w zakresie <100 ms, spójrz na wydajność dla „klasy” oprogramowania.

  • Czy używa tylko lokalnego pamięci RAM? -> najszybszy
  • Czy używa zdalnego RAM? -> szybko
  • Czy używa ram plus dysk twardy -> oh hurm.
  • Czy używa tylko twardego dysku -> uruchom!
Daniel
źródło
3
Nie ma żadnego narzędzia do obsługi replikacji przy użyciu memcache, o którym wiem. Pamięć podręczna ma służyć wyłącznie jako pamięć podręczna. Jeśli przedmiot zostanie oczyszczony / utracony, należy go odbudować. Nie korzystałem z tego wcześniej ani go nie oceniałem, ale może to Cię zainteresować. code.google.com/p/memagent
Daniel
1
Membase obsługuje protokół memcached, ale także trwałość i replikację.
Jim Ferrans
1
Ostatnio widziałem połączony Ethernet na 4 portach. 4 x 44 MB / s. To sprawia, że ​​baran jest jeszcze bardziej wartościowy, zakładając, że możesz zacząć wiązać ethernet!
Daniel
1
Ze względu na przyszłe odniesienia, Facebook open source niedawno mcrouter, który dodaje replikację do memcached. Inne rzeczy również są przestarzałe (redis jest teraz super szybki itp.), Ale jeśli jesteś tutaj pięć lat później ...
dannysauer
o co chodzi? obaj nie mogą przechowywać prostego direclty tablicy json, najczęściej WIDELNIE używanego formatu wymiany danych w sieci, nie mam pojęcia, o czym myśleli ... och, może powinienem dodać ReJSON, ponieważ natywnie nikt nie dba o JSON na świecie, prawda
PirateApp,
205

Zależy od tego, czego potrzebujesz, ogólnie myślę, że:

  • Nie powinieneś zbytnio przejmować się występami. Redis jest szybszy na rdzeń z małymi wartościami, ale Memcached może używać wielu rdzeni z jednym plikiem wykonywalnym i portem TCP bez pomocy klienta. Także memcached jest szybszy z dużymi wartościami rzędu 100k. Redis ostatnio znacznie poprawił duże wartości (niestabilna gałąź), ale nadal memcached jest szybszy w tym przypadku użycia. Chodzi o to, że ani jedno, ani drugie nie będzie prawdopodobnie wąskim gardłem w zakresie dostarczania zapytań na sekundę.
  • Powinieneś dbać o wykorzystanie pamięci. Dla prostych par klucz-wartość memcached jest bardziej efektywny pod względem pamięci. Jeśli używasz skrótów Redis, Redis jest bardziej wydajny pod względem pamięci. Zależy od przypadku użycia.
  • Powinieneś dbać o trwałość i replikację, dwie funkcje dostępne tylko w Redis. Nawet jeśli Twoim celem jest zbudowanie pamięci podręcznej, pomaga to, że po aktualizacji lub ponownym uruchomieniu komputera dane nadal są dostępne.
  • Powinieneś dbać o rodzaj operacji, których potrzebujesz. W Redis jest wiele skomplikowanych operacji, nawet biorąc pod uwagę przypadek użycia pamięci podręcznej, często można wykonać znacznie więcej w jednej operacji, bez konieczności przetwarzania danych po stronie klienta (czasem potrzebne jest wiele operacji we / wy). Operacje te są często tak szybkie, jak zwykłe GET i SET. Jeśli więc nie potrzebujesz tylko GET / SET, ale bardziej skomplikowanych rzeczy, Redis może bardzo pomóc (pomyśl o buforowaniu na osi czasu).

Bez przypadku użycia trudno jest teraz wybrać właściwy, ale myślę, że w wielu przypadkach Redis ma sens, ponieważ nawet jeśli nie chcesz używać go jako bazy danych, będąc o wiele bardziej zdolnym, możesz rozwiązać więcej problemów, nie tylko buforowanie, ale nawet wiadomości, ranking itd.

Ps oczywiście mogłem być stronniczy, ponieważ jestem głównym programistą projektu Redis.

antirez
źródło
67
+1 za świetne ujawnienie na końcu
NateDSaint
6
Nie jestem pewien, czy to pomyłka językowa, ale jeśli popierasz argument „ogólnie uważam, że nie powinieneś zbytnio przejmować się wydajnością”, to poważny powód do niepokoju. Redis może być bardzo dobry w przypadku niektórych klas problemów, ale tradycyjnie memcache był używany specjalnie do rozwiązywania problemów z wydajnością z trwałymi bazami danych. Myślę też, że rażącym pominięciem na twojej liście jest dojrzałość produktu. Memcache to dojrzały produkt z około dziesięcioletnim doświadczeniem. Redis jest obiecujący, ale istnieje od około 3 lat.
DougW
1
@DougW Zabierasz to wyrażenie z kontekstu. Ma to o wiele większy sens, gdy czytasz zdanie zamykające akapit zaraz po: „Chodzi o to, że ani jedno, ani drugie prawdopodobnie nie będzie twoim wąskim gardłem w zakresie dostarczania zapytań na sekundę”
Dinei,
83

Więc szczerze - czy memcache to naprawdę ten stary dinousaur, który jest złym wyborem z punktu widzenia wydajności w porównaniu do tego nowicjusza o imieniu Redis?

  • Porównanie zestawów funkcji Redisma wtedy znacznie większą funkcjonalność;
  • Porównywanie łatwości instalacji Redisjest również znacznie łatwiejsze. Nie są wymagane zależności;
  • RedisLepsze jest także porównywanie aktywnego rozwoju ;
  • Wierzę, że memcachedjest trochę szybszy niż Redis. W ogóle nie dotyka dysku;
  • Moim zdaniem jest Redisto lepszy produkt niż memcached.
Alfred
źródło
31
Redis dotyka dysku tylko wtedy, gdy zostaniesz o to poproszony. Zwykle wykonuje synchronizację co około sekundę -> tego nie zauważysz
Marc Seeger
1
@Marc yup. Wierzę też, że możesz powiedzieć, żeby w ogóle nie dotykała dysku, ale czy w tej chwili uważam, że zawsze jest to fsyncs?
Alfred
3
Z mojego doświadczenia wynika również, że Redis jest nieco szybszy niż Memcached (w przypadku korzystania z Redis w trybie tylko pamięci). Antirez wykonał test tutaj antirez.com/post/redis-memcached-benchmark.html
Sune Rievers
10
DUŻA RÓŻNICA: Memcached jest wielowątkowy, a Redis nie. O ile opóźnienie pojedynczego żądania jest porównywalne, Memcached może obsłużyć o wiele więcej żądań, gdy współbieżność jest wysoka. Z drugiej strony Redis osiągnie szczyt wydajności przy zaledwie kilku równoległych żądaniach, ponieważ wykorzystuje tylko 1 rdzeń / wątek procesora. Sugerowaną metodą obejścia tego jest uruchomienie wielu instancji Redis na jednym komputerze ze spójnym haszowaniem, ale jest to naprawdę kiepskie rozwiązanie. Więc jeśli potrzebujesz wysokiej współbieżności i masz wielordzeniowy procesor (kto tego nie robi), Memcached jest DUŻO szybszy.
ColinM
2
@Alfred, nie jest ukrytym faktem, że Redis jest jednowątkowy, jest to decyzja projektowa (prostota nad solidnością) przez autora. Artykuł Dustin powiązany z powyższym jest solidnym dowodem na to, że ma realny wpływ. Potwierdziłem to również we własnych testach porównawczych, używając Redis jako backendu Zend_Cache; wraz ze wzrostem współbieżności Redis osiągnie plateau raczej szybko w porównaniu do memcached.
ColinM
46

To, co zapamiętał, czego nie robi Redis, to ostatnio używana eksmisja wartości z pamięci podręcznej. Dzięki memcached możesz bezpiecznie ustawić tyle wartości, ile chcesz, a kiedy przepełnią pamięć, te, których ostatnio nie używałeś, zostaną usunięte. Dzięki Redis możesz to tylko przybliżyć, ustawiając limit czasu na wszystko; kiedy musi zwolnić pamięć, zajrzy do trzech losowych kluczy i usunie ten, który jest najbliższy wygaśnięciu.

To główna różnica, jeśli używasz go tylko jako pamięci podręcznej.

Peter Scott
źródło
13

Możesz także zajrzeć na Membase.

http://www.northscale.com/products/membase_server.html

Nie korzystałem z niego, ale wydaje się być podobny do Redisa, ponieważ jest to skoncentrowany na pamięci sklep KV z trwałością. Główne różnice w stosunku do tego, co widzę, to:

  • Redis ma znacznie więcej możliwości manipulacji danymi (zestawy uporządkowane itp.)
  • Redis ma oczekujący projekt klastra Redis, aby zwiększyć skalowalność w poziomie
  • Redis ma pojedynczą warstwę odciążenia danych na dysk (VM) opartą na hybrydowym algorytmie uwzględniającym zarówno LRU, jak i rozmiar obiektu.

  • Membase wykorzystuje protokół memcached wire - przydatny jako ścieżka aktualizacji dla istniejących aplikacji

  • Membase jest skonfigurowany do skalowania w poziomie za pomocą rozproszonego podejścia hashtable
  • Membase może obsługiwać wiele poziomów odciążania danych przy użyciu podejścia LRU (bardzo rzadko używany jest na dysk, nieco rzadko na SSD, często pozostaje w pamięci RAM)
  • Nie jestem pewien co do możliwości TTL w Membase.

Wybór może zależeć od stopnia, w jakim Twoja aplikacja może wykorzystać dodatkowe funkcje manipulacji danymi w Redis.

HikeOnPast
źródło
Cześć Dean, dziękuję za twój post. Na pewno to sprawdzę. Czy mogę używać Membase w PHP?
Przemysłowy
4
Ponieważ Membase używa protokołu memcached, każdy z klientów memcached powinien działać: wiki.membase.org/bin/view/Main/Clients
HikeOnPast
Membase obsługuje TTL. Wszystkie implementacje Memcache obsługują okresy ważności. github.com/memcached/memcached/blob/master/doc/protocol.txt#L79
Saurav