Kiedy powinienem używać Memcache zamiast Memcached?

321

Wygląda na to, że PHP ma dwie biblioteki memcached o nazwie memcache i memcached . Jaka jest różnica i skąd wiesz, którego użyć? Czy ktoś jest przestarzały? Wygląda na to, że memcached oferuje więcej metod, więc przypuszczam, że oznacza to największy rozwój - ale wydaje się również, że wymaga zewnętrznych bibliotek C / C ++, więc nie jestem pewien, czy mogę go zainstalować.

Wygląda na to, że memcache istnieje już dłużej, nie wymaga dodatkowych bibliotek i ma wstępnie skompilowane pliki binarne nawet dla systemu Windows! Sądzę, że na razie będzie to lepszy wybór. Jednak będąc nowym w Memcached (serwer) nie jestem pewien, czy istnieją jakieś bardzo ważne funkcje w Memcached (php), które sprawiają, że warto dodatkowych kłopotów.

Xeoncross
źródło
1
ZendCon ma fajny odcinek porównujący oba. ZendCon Sessions Episode 040: Memcached: lepszy interfejs Memcache
John Magnolia
duplikat serverfault.com/questions/63383/memcache-vs-memcached przez zaledwie kilka dni, ale uzyskało to więcej wyświetleń i głosów :)
Stefano

Odpowiedzi:

249

Biblioteka klientów Memcached została niedawno wydana jako stabilna. Jest używany przez digg (został opracowany dla digg przez Andrei Zmievskiego, teraz już nie z digg) i implementuje znacznie więcej protokołu memcached niż starszy klient memcache. Najważniejsze funkcje memcached to:

  1. Tokeny Cas . To znacznie ułatwiło mi życie i jest łatwym systemem zapobiegającym nieaktualnym danym. Ilekroć wyciągasz coś z pamięci podręcznej, możesz za jego pomocą otrzymać token cas (podwójna liczba). Możesz następnie użyć tego tokena do zapisania zaktualizowanego obiektu. Jeśli nikt inny nie zaktualizował wartości podczas działania wątku, zamiana zakończy się powodzeniem. W przeciwnym razie utworzono nowszy token cas i musisz ponownie załadować dane i zapisać je ponownie z nowym tokenem.
  2. Odczytywanie zwrotne jest najlepszą rzeczą od krojonego chleba. Uproszczono wiele mojego kodu.
  3. getDelayed () to przyjemna funkcja, która może skrócić czas oczekiwania skryptu na powrót wyników z serwera.
  4. Chociaż serwer memcached ma być bardzo stabilny, nie jest najszybszy. W nowszym kliencie można używać protokołu binarnego zamiast ASCII.
  5. Za każdym razem, gdy zapisujesz złożone dane w memcached, klient zawsze dokonywał serializacji wartości (co jest powolne), ale teraz w kliencie memcached masz opcję użycia igbinary . Do tej pory nie miałem okazji przetestować, jaki to może być wzrost wydajności.

Wszystkie te punkty wystarczyły mi, aby przejść do najnowszego klienta i mogę powiedzieć, że działa jak urok. Istnieje zależność zewnętrzna od biblioteki libmemcached , ale mimo to udało się ją zainstalować na Ubuntu i Mac OSX, więc do tej pory nie było żadnych problemów.

Jeśli zdecydujesz się na aktualizację do nowszej biblioteki, sugeruję aktualizację do najnowszej wersji serwera, ponieważ ma ona również kilka fajnych funkcji. Będziesz musiał zainstalować libevent , aby się skompilować, ale na Ubuntu nie było większego problemu.

Do tej pory nie widziałem, żeby jakieś frameworki pobierały nowego klienta memcached (chociaż nie śledzę ich), ale zakładam, że Zend wkrótce dołączy.

AKTUALIZACJA

Zend Framework 2 ma adapter do Memcached, który można znaleźć tutaj

Miha Hribar
źródło
1
Doskonała odpowiedź; Ponadto zewnętrzna zależność od libmemcached jest w tym przypadku plusem, ponieważ jest to jeden z bardziej aktywnie rozwijanych klientów.
Marc Bollinger,
Zgoda. Zewnętrzna zależność od libmemcached nie powinna być uważana za problem, podobnie jak libevent.
Miha Hribar
1
Ta sprawa z tokenami Cas brzmi jak największy plus. W rzeczywistości, patrząc na te funkcje, prawie wydaje się, że memcached zmierza bardziej do zarządzanego posiadacza danych, takiego jak DB, a mniej do tymczasowej pamięci podręcznej.
Xeoncross,
Jeśli tego szukasz, masz już memcachedb ( memcachedb.org ), który w rzeczywistości jest tylko bazą danych Berkley, która mówi protokół memcached.
Miha Hribar
8
ta odpowiedź nie mówi nawet o różnicy między memcache a memcached?! czy memcache to tylko starsza wersja memcached?
Daniel W.,
10

W systemie Windows porównanie jest skrócone: memcachewydaje się być jedynym dostępnym klientem.

rymo
źródło
Czy nie zawsze możesz dodać memcachedrozszerzenie w sobie?
Pacerier
1
Nie wydaje się, żeby to była prawda. commaster.net/content/installing-memcached-windows
Joe Leonard
@JoeLeonard ze strony, do której prowadzi link: „Aby połączyć się z memcachedPHP, musisz zainstalować memcacherozszerzenie dla PHP”
rymo
8

Jest rok 2013. Zapomnij o komentarzach z 2009 roku. Podobnie, jeśli prowadzisz poważne obciążenie ruchem, nawet nie zastanawiaj się, jak zrobić z memcache opartym na systemie Windows. W przypadku bardzo dużej skali (ponad 500 serwerów WWW) i ponad 20 serwerów baz danych i replikantów (mix mysql i mssql) farma serwerów memcached (12 serwerów w grupie) obsługuje wiele aplikacji OLTP o dużej objętości odpowiadających 25 000 ~ 40 000 m-> odbieraj połączenia na sekundę. Są to połączenia, które NIE muszą docierać do bazy danych.

IMHO, to użycie memcached zapewniło POWAŻNE $$$, $$$ oszczędności na CAPEX dla nowych serwerów DB i licencji, a także na umowach wsparcia dla dużych projektów komercyjnych.

Mike Trest
źródło
48
Jak to odpowiada na pytanie o różnice między tymi 2 implementacjami protokołu memcache w php?
Marki555
9
To powinien być komentarz.
Elijah Lynn
7

Memcached to nowszy interfejs API, zapewnia także memcached jako dostawcę sesji, co może być świetne, jeśli masz farmę serwerów.

Po tym, jak wersja jest nadal bardzo niska, 0.2, ale użyłem obu i nie napotkałem poważnego problemu, więc poszedłbym do memcached, ponieważ jest nowy.

RageZ
źródło
1
Oba faktycznie działają jako procedury obsługi sesji, chociaż nigdy nie chciałbym ich do tego używać. us3.php.net/manual/en/memcache.examples-overview.php
Xeoncross 18.09.09
dobrze złap mnie źle, tak, jest to naprawdę przydatne na dużym serwerze, kiedy io staje się naprawdę ważne, a ponadto memcache nie potwierdza, że ​​nie upuści jakiegoś obiektu, aby uzyskać pamięć tak trudną do zrozumienia, jak skalować rzeczy.
RageZ
1
Wersja 0.2 została odtąd przewyższona przez stabilną wersję 1.0.0.
Miha Hribar,