Buforowanie obiektów WordPress: Redis, Memcached i natywne API

Opublikowany: 2017-11-04

Witryny WordPress klasy korporacyjnej, które można dowolnie skalować, wymagają trwałego mechanizmu buforowania poza stronami i obrazami, mechanizmu, który może buforować rzeczywiste obiekty PHP. Chociaż WordPress zapewnia mechanizm buforowania obiektów za pośrednictwem pamięci podręcznej obiektów WordPress, istnieją inne rozwiązania, które oferują dużą dźwignię i moc. Ale zanim przejdziemy do tego wszystkiego , najpierw musimy zobaczyć, czym jest buforowanie obiektów i jak działa w PHP.

Co to jest buforowanie obiektów?

PHP jest językiem zorientowanym obiektowo. Wykorzystuje paradygmat Object do struktury kodu. W rezultacie Twoja witryna WordPress składa się z wielu różnych obiektów PHP, które są stale tworzone, tworzone i niszczone (przez menedżera pamięci). Tworzenie i niszczenie obiektów wiąże się z kosztami ogólnymi, zwłaszcza jeśli jest ich wiele. Jednak większość z nich jest często ponownie wykorzystywana, ponieważ reprezentują one podstawowe funkcje. Oznacza to, że za każdym razem, gdy aplikacja będzie ich ponownie potrzebować, będzie musiała utworzyć ich instancję od początku.

Co by było, gdybyś mógł buforować często używany obiekt z instancją, dzięki czemu nie musiałbyś cały czas go niszczyć i tworzyć?

Możesz użyć funkcji serialise() PHP, aby przekonwertować obiekt lub prymityw na reprezentację liczbową (bajt blob), która może być przechowywana w pamięci lub na dysku w celu późniejszego dostępu. Następnie obliczasz numer skrótu bajtowego obiektu blob za pomocą funkcji hash() i przechowujesz oba z nich. Skrót jako klucz i bajtowy obiekt blob jako wartość. Aby go pobrać, użyj obliczonego numeru skrótu bajtowego obiektu blob, który był początkowo przechowywany jako klucz. W ten sposób możesz zamienić wszystko (String, Integer, Object, Boolean, Array, itp.) w przechowywaną reprezentację wartości.

Przykład:

$serialized = serialize( array ( 'test' ));

Wykonaj operację odwrotną za pomocą unserialize():

$original = unserialize ( $serialized );

Ogólnie rzecz biorąc, istnieją trzy sposoby buforowania obiektów: przy użyciu natywnej pamięci podręcznej obiektów WordPress, interfejsu API Transients lub zewnętrznego magazynu klucz-wartość, takiego jak Redis lub Memcached.

Buforowanie obiektów WordPress

WordPress oferuje dwa interfejsy API buforowania obiektów: natywną pamięć podręczną obiektów WordPress i interfejs API Transients. Są identyczne i chociaż może to powodować zamieszanie, kryje się za tym logika.

Natywna pamięć podręczna obiektów WordPress może przechowywać obiekty i elementy podstawowe w pamięci podręcznej, ale domyślnie nie w sposób trwały. Oznacza to, że buforowanie odbywa się w pamięci, a buforowane obiekty nie żyją dłużej niż cykl życia żądania. Nie możesz więc udostępniać obiektów z pamięci podręcznej między różnymi ładowanymi stronami. Musisz dostarczyć własną implementację sklepu z wykorzystaniem Drop-Ins, czyli „zaawansowanych” wtyczek, które mogą rozszerzyć funkcjonalność WordPressa. Możesz je zobaczyć na swoim pulpicie WordPress, na liście wtyczek:

Wtyczki WordPress

Z drugiej strony interfejs API Transients działa po wyjęciu z pudełka. Możesz zapisywać zmienne, tablice, obiekty powiązane z datą ważności bezpośrednio w bazie danych i mieć trwałe buforowanie obiektów. Problem polega jednak na tym, że po wygaśnięciu obiektów z pamięci podręcznej pozostają one w bazie danych, zajmując miejsce. Oznacza to, że utrzymywanie bazy danych wiąże się z dodatkowym nakładem pracy, co jakiś czas przycinając wygasłe obiekty.

WordPress wykrywa, czy zaimplementowałeś własną, trwałą pamięć podręczną obiektów, a gdy stwierdzi, że tak jest, wywołania interfejsu API Transients są pomijane i kierowane do pamięci podręcznej obiektów WordPress (a tym samym są one identyczne).

Deweloperzy mogą zaimplementować własną pamięć podręczną obiektów, skorzystać z wtyczki WordPress (więcej o tym później) lub naszej własnej implementacji, jeśli klient Pressidium. Pamięć podręczna obiektów nie jest domyślnie włączona, ponieważ może to spowodować obniżenie wydajności, jeśli zostanie użyte w niewłaściwej sytuacji. Nie ma jednego uniwersalnego rozwiązania, jeśli chodzi o buforowanie obiektów w witrynach WordPress.

Redis i Memcached

Magazyny klucz-wartość nie używają tabel i wstępnie zdefiniowanych typów danych do przechowywania informacji w rekordach, takich jak RDBMS. Są one przeznaczone do przechowywania i pobierania par klucz/wartość, tak jak w słownikowych strukturach danych, które można znaleźć w językach programowania.

Dobrym przykładem takiego sklepu jest Redis. Oprócz słownikowych struktur danych obsługuje wiele innych, w tym zaawansowane, takie jak posortowane zbiory z zapytaniami o zakres i indeksy geoprzestrzenne z zapytaniami o promień. Oferuje trwałe buforowanie obiektów .

Redis

Redis to nie tylko magazyn klucz-wartość lub pamięć podręczna. Obsługuje replikację danych, skrypty, wysoką dostępność w konfiguracji klastrowej. Możesz także dostosować żądany poziom trwałości na dysku. Dobrą rzeczą w Redis jest to, że po ponownym uruchomieniu większość pamięci podręcznej nadal będzie znajdować się na dysku, a utracone dane będą tylko niewielką częścią. Rzecz w tym, że po restarcie serwer musiałby odbudować pamięć podręczną, a to w większości przypadków zwiększa obciążenie. Z Redis tak się nie dzieje. Ponadto wygasłe obiekty są natychmiast usuwane z bazy danych. Tam też nie ma czasu na zarządzanie.

Redis Labs ma doskonałą stronę prezentującą przypadki użycia Redis w przedsiębiorstwie: od bardzo dużych zbiorów danych po wyszukiwanie pełnotekstowe, serie w czasie rzeczywistym, integrację ze Sparkiem i wiele innych.

Chociaż wszystkie te funkcje kosztują złożoność i być może w niektórych przypadkach szybkość, optymalizacja kodu Redis Drop-In może przynieść sporo korzyści. Nie zapominaj, że Redis wykonuje trwałe buforowanie obiektów , czego nie robi Memcached, chociaż jest znacznie prostszy w użyciu.

Memcached

Memcached to wysokowydajny system buforowania obiektów w pamięci, który zgodnie z oficjalną stroną internetową został zaprojektowany specjalnie w celu przyspieszenia dynamicznych aplikacji internetowych i zmniejszenia obciążenia bazy danych. Jest również znacznie prostszy i łatwiejszy w użyciu niż Redis.

Ze względu na to, że jest specjalnie zaprojektowany do buforowania obiektów dla stron internetowych, a fakt, że korzysta z bazy danych w pamięci, sprawia, że ​​jest to najszybsze rozwiązanie do buforowania obiektów. Jednak, jak wspomnieliśmy wcześniej, ponowne uruchomienie serwera oznacza, że ​​pamięć podręczna jest niedostępna. I dopóki nie zostanie odbudowany, prawdopodobnie będziesz doświadczał zwiększonego obciążenia. Ale jak mówią twórcy: „pomyśl o tym jako o pamięci krótkotrwałej dla swojej witryny”, więc zależy to raczej od tego, co chcesz robić w pierwszej kolejności.

Ponieważ Memcached używa bazy danych w pamięci do przechowywania pamięci podręcznej, jest bardzo wydajny w buforowaniu zapytań SQL, wyników wywołań funkcji i tym podobnych.

Wtyczki WordPress

  • WP Redis, oficjalna wtyczka Redis WordPress. Obsługuje WP-CLI, klastrowanie i replikację.
  • Redis Object Cache Kolejna back-endowa wtyczka Redis dla WordPressa.
  • Memcached Object Cache, backend dla Memcached.
  • Usuń wygasłe transjenty, ta wtyczka usuwa wygasłe transjenty z bazy danych. Obsługuje również wiele witryn!

Jak przeprowadzać testy porównawcze

Celem naszego artykułu jest podekscytowanie się buforowaniem obiektów i rozpoczęcie samodzielnego majsterkowania. Możesz wypróbować różne trwałe implementacje pamięci podręcznej i zobaczyć, jak dobrze zachowuje się Twoja aplikacja. Możesz użyć funkcji microsecond() PHP do porównania wywołań. Na przykład: Wywołaj microsecond microsecond() przed i po wywołaniu wp_cache_get() , odejmij wartości i zapisz wynik. Zrób to dla różnych implementacji pamięci podręcznej i zobacz, w jakich przypadkach zauważysz wzrost wydajności.

W Pressidium nie mamy domyślnie włączonego buforowania obiektów i chociaż jest to coś, o co można poprosić, zwykle nie zalecamy tego od samego początku. Przeprowadzamy testy i upewniamy się, że Twoja strona będzie czerpać z tego korzyści.

Wniosek

Załóżmy, że aby wyrenderować stronę aplikacja musi odczytać 2000 obiektów przejściowych. Oznacza to 2000 odczytów w bazie danych. Korzystając z trwałego systemu buforowania obiektów, te 2000 odczytów jest przenoszonych do magazynu klucz-wartość. Jeśli używasz memcached, ryzykujesz utratę całej pamięci podręcznej w nagłym ponownym uruchomieniu. Ogólnie rzecz biorąc, Redis może nie być tak szybki jak Memcached, ale jego funkcje Enterprise i trwałość przynoszą korzyści w dłuższej perspektywie.

Jednak jeden rozmiar nie pasuje do wszystkich! Na przykład widzieliśmy instancje Redis, które faktycznie spowalniały strony internetowe, a w innych przypadkach niesamowicie je przyspieszały. Ma to związek z wieloma obiektami, których używa twoja aplikacja: ogólnie, jeśli twoja aplikacja używa kilku (powiedzmy tuzina), nie odniesiesz większych korzyści z buforowania obiektów, a w najgorszym przypadku będziesz mieć obciążenie sieci. Jeśli jednak Twoja aplikacja jest w setkach, warto zajrzeć.