WordPress Nesne Önbelleğe Alma: Redis, Memcached ve yerel API'ler

Yayınlanan: 2017-11-04

İsteğe göre ölçeklenebilen kurumsal düzeyde WordPress siteleri, gerçek PHP nesnelerini önbelleğe alabilen bir mekanizma olan sayfaların ve görüntülerin ötesinde kalıcı bir önbelleğe alma mekanizmasına ihtiyaç duyar. WordPress, WordPress Nesne Önbelleği aracılığıyla bir nesne önbelleğe alma mekanizması sağlamasına rağmen, büyük bir kaldıraç ve güç sunan başka çözümler de vardır. Ancak tüm bunlara girmeden önce, nesne önbelleğe almanın ne olduğunu ve PHP'de nasıl çalıştığını görmemiz gerekiyor.

Nesne önbelleğe alma nedir?

PHP, Nesne yönelimli bir dildir. Kodu yapılandırmak için Nesne paradigmasını kullanır. Sonuç olarak, WordPress siteniz sürekli olarak oluşturulan, somutlaştırılan ve yok edilen (bellek yöneticisi tarafından) birçok farklı PHP Nesnesinden oluşur. Nesneleri oluşturmak ve yok etmek, özellikle çok sayıdaysa, ek bir maliyeti vardır. Bununla birlikte, bunların çoğu, temel işlevleri temsil ettikleri için çok fazla yeniden kullanılma eğilimindedir. Bu, uygulamanın bunlara her yeniden ihtiyaç duyduğunda, bunları en baştan başlatması gerekeceği anlamına gelir.

Ya sık kullanılan bir nesneyi önbelleğe alabilseydiniz, böylece onu her zaman yok edip yaratmanız gerekmez miydi?

PHP'nin serialise() işlevini, bir nesneyi veya bir ilkel öğeyi, daha sonra erişim için bellekte veya diskte saklanabilecek bir sayı temsiline (bayt blob) dönüştürmek için kullanabilirsiniz. Ardından, hash() işlevini kullanarak bayt bloğunun karma numarasını hesaplar ve her ikisini de depolarsınız. Anahtar olarak karma ve değer olarak bayt blobu. Onu geri almak için, başlangıçta bir anahtar olarak depolanan bayt bloğunun hesaplanmış karma numarasını kullanırsınız. Herhangi bir şeyi (String, Integer, Object, Boolean, Array, vb.) bu şekilde bir değerin depolanabilir bir temsiline dönüştürebilirsiniz.

Örnek:

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

unserialize() ile ters işlemi gerçekleştirin:

$original = unserialize ( $serialized );

Genel olarak, nesneleri önbelleğe almanın üç yolu vardır: Yerel WordPress Nesne Önbelleğini, Geçici API'yi veya Redis veya Memcached gibi harici bir anahtar/değer deposunu kullanma.

WordPress Nesne önbelleğe alma

WordPress, iki nesne önbelleğe alma API'si sunar: Yerel WordPress Nesne Önbelleği ve Geçici Durumlar API'si. Bunlar aynıdır ve bu karışıklığa neden olsa da arkasında bir mantık vardır.

Yerel WordPress Nesne Önbelleği, nesneleri ve temel öğeleri önbellekte saklayabilir, ancak varsayılan olarak kalıcı bir şekilde değil. Bu, önbelleğe alma işleminin bellekte gerçekleştiği ve önbelleğe alınan nesnelerin, isteğin yaşam döngüsünün ötesinde yaşamadığı anlamına gelir. Böylece, önbelleğe alınmış nesnelerinizi farklı sayfa yüklemelerinde paylaşamazsınız. WordPress işlevselliğini genişletebilen "gelişmiş" eklentiler olan Drop-In'leri kullanarak kendi mağaza uygulamanızı sağlamanız gerekir. Bunları WordPress kontrol panelinizde, eklenti listesinde görebilirsiniz:

WordPress Eklentileri

Transients API ise kutudan çıktığı gibi çalışır. Değişkenleri, dizileri, bir sona erme tarihine bağlı nesneleri doğrudan bir veritabanına kaydedebilir ve kalıcı nesne önbelleğe alma işlemine sahip olabilirsiniz. Ancak sorun şu ki, önbelleğe alınmış nesneleriniz sona erdiğinde, yer kaplayan veritabanında kalırlar. Bu, veritabanının bakımı için harcanan, süresi dolmuş nesneleri her seferinde budamak için fazladan bir ek yük olduğu anlamına gelir.

WordPress, kendi kalıcı nesne önbelleğinizi uygulayıp uygulamadığınızı algılar ve durumun böyle olduğunu tespit ettiğinde, Transients API'sine yapılan çağrılar atlanır ve WordPress Nesne Önbelleğine yönlendirilir (ve dolayısıyla bunların aynı olmasının nedeni).

Geliştiriciler kendi nesne önbelleklerini uygulayabilir, bir WordPress eklentisini (daha sonraları hakkında daha fazla bilgi) veya bir Pressidium istemcisi ise kendi uygulamamızı kullanabilir. Yanlış durumda kullanılırsa performans cezalarına neden olabileceğinden, varsayılan olarak nesne önbelleğini açmayız. WordPress sitelerinde nesne önbelleğe alma söz konusu olduğunda, "herkese uyan tek bir çözüm" yoktur.

Redis ve Memcached

Anahtar-değer depoları, RDBMS gibi kayıtlarda bilgi depolamak için tabloları ve önceden tanımlanmış veri türlerini kullanmaz. Programlama dillerinde bulduğunuz sözlük veri yapılarında olduğu gibi, anahtar/değer çiftlerini saklamak ve almak için tasarlanmıştır.

Böyle bir mağazanın güzel bir örneği Redis'tir. Sözlük veri yapılarının yanı sıra, aralık sorgularıyla sıralanmış kümeler ve yarıçap sorgularıyla coğrafi uzamsal dizinler gibi gelişmiş olanlar da dahil olmak üzere çok sayıda diğerini destekler. Kalıcı nesne önbelleğe alma sunar.

redis

Redis, yalnızca bir anahtar/değer deposu veya önbellek değildir. Bir küme yapılandırmasında veri çoğaltma, komut dosyası oluşturma, yüksek kullanılabilirliği destekler. Ayrıca, istediğiniz diskte kalıcılık düzeyine ince ayar yapabilirsiniz. Redis'in iyi yanı, yeniden başlatma yaparsanız, önbelleğinizin çoğu diskte kalmaya devam edecek ve kaybolan veriler yalnızca küçük bir kısım olacaktır. Mesele şu ki, yeniden başlatıldığında sunucunun önbelleği yeniden oluşturması gerekecek ve bu çoğu zaman yükü artırıyor. Redis ile bu olmaz. Ayrıca, süresi dolmuş nesneler veritabanından hemen silinir. Orada da yönetim ek yükü yok.

Redis Labs, Kuruluştaki Redis kullanım örneklerini gösteren mükemmel bir sayfaya sahiptir: Bunlar, Çok Büyük Veri Kümeleri'nden tam metin arama, Gerçek Zamanlı Seriler, Spark entegrasyonu ve daha fazlasına kadar uzanır.

Tüm bu özellikler bazı durumlarda karmaşıklık ve belki de hız açısından maliyetli olsa da, Redis Drop-In kodunuzu optimize etmek epeyce kazanç sağlayabilir. Redis'in, kullanımı çok daha basit olmasına rağmen, Memcached'in yapmadığı bir şey olan kalıcı nesne önbelleğe alma işlemini yaptığı gerçeğini unutmayın.

önbelleğe alınmış

Memcached, resmi web sitesine göre, dinamik web uygulamalarını hızlandırmak ve veritabanı yükünü hafifletmek için özel olarak tasarlanmış, bellek içi yüksek performanslı bir nesne önbelleğe alma sistemidir. Ayrıca Redis'ten çok daha basit ve kullanımı kolaydır.

Web sayfaları için nesne önbelleğe alma yapmak için özel olarak tasarlanmış olması ve bir bellek içi veritabanı kullanması, onu oradaki en hızlı nesne önbelleğe alma çözümü yapar. Ancak daha önce de belirttiğimiz gibi sunucunuz yeniden başlarsa önbelleğiniz bitmiş demektir. Ve yeniden inşa edilene kadar, muhtemelen artan yük yaşayacaksınız. Ancak yaratıcıların dediği gibi: “Bunu web siteniz için kısa süreli bir hafıza olarak düşünün”, bu yüzden daha çok ilk etapta ne yapmak istediğinize bağlı.

Memcached, önbelleği tutmak için bir bellek içi veritabanı kullandığından, SQL sorgularını, işlev çağrısı çıktılarını vb. önbelleğe almada çok verimlidir.

WordPress Eklentileri

  • WP Redis, resmi Redis WordPress eklentisi. WP-CLI, kümeleme ve çoğaltmayı destekler.
  • Redis Nesne Önbelleği WordPress için başka bir arka uç Redis Eklentisi.
  • Memcached Nesne Önbelleği, Memcached için arka uç.
  • Süresi Dolmuş Geçici Olayları Sil, bu eklenti süresi dolmuş geçici olayları veritabanından siler. Çoklu siteleri de destekler!

Karşılaştırmalar nasıl çalıştırılır

Makalemizin amacı, sizi nesne önbelleğe alma konusunda heyecanlandırmak ve kendi başınıza tamir etmeye başlamaktır. Çeşitli kalıcı önbellek uygulamalarını deneyebilir ve uygulamanızın ne kadar iyi davrandığını görebilirsiniz. Çağrıları kıyaslamak için PHP'nin microsecond() işlevini kullanabilirsiniz. Örneğin: wp_cache_get() çağırmadan önce ve sonra microsecond() öğesini çağırın, değerleri çıkarın ve sonucu saklayın. Bunu çeşitli önbellek uygulamaları için yapın ve hangi durumlarda bir performans artışı fark ettiğinizi görün.

Pressidium'da, varsayılan olarak nesne önbelleğe alma özelliği etkin değildir ve bu istenebilecek bir şey olsa da, genellikle başlangıçtan bunun lehinde tavsiyede bulunmayız. Testler yapıyoruz ve sitenizin bundan fayda sağlayacağından emin oluyoruz.

Çözüm

Diyelim ki bir sayfa oluşturmak için uygulamanın 2.000 geçici nesneyi okuması gerekiyor. Bu, veritabanında 2.000 okuma anlamına gelir. Kalıcı bir nesne önbelleğe alma sistemi kullanılarak, bu 2.000 okuma, anahtar/değer deposuna boşaltılır. Memcached kullanıyorsanız, ani bir yeniden başlatmada tüm önbelleğinizi kaybetme riskiyle karşı karşıya kalırsınız. Genel olarak Redis, Memcached kadar hızlı olmayabilir, ancak Enterprise özellikleri ve kalıcılığı uzun vadede size fayda sağlar.

Ancak, bir boyut herkese uymuyor! Örneğin, web sitelerini gerçekten yavaşlatan ve diğer durumlarda onları inanılmaz derecede hızlandıran Redis örnekleri gördük. Bu, uygulamanızın kullandığı birkaç nesneyle ilgilidir: genel olarak, uygulamanız birkaç (diyelim bir düzine) nesne kullanıyorsa, nesne önbelleğe alma işleminden fazla fayda sağlamazsınız ve en kötü durumda, ağ yükü var. Bununla birlikte, başvurunuz yüzlerce ise, bir göz atmak işe yarayabilir.