Memcached İle Site Hızlandırma ve Sorgu Optimizasyonu

Memcached İle Site Hızlandırma ve Sorgu Optimizasyonu

Hemen şunu belirteyim: Sadece MySQL değil, dilediğiniz her şeyi memcache üzerine atabilir ve daha sonra okuyabilirsiniz. Sisteminizde memcache kullanacaksanız alt yapı kurgunuzu buna göre tekrar revize etmelisiniz çünkü memcache tarafına atılan bir veri değişirse, aynı zamanda bu veriyi de memcache üzerinden silmelisiniz.

Memcached'in sunucu seviyesinde kurulu olduğundan ve php.ini'de aktif edildiğinden emin olunuz. Ayrıca yeterli miktarda RAM verildiğinden de emin olmak gerek. Alt yapısını yönettiğim yaklaşık 1.000.000 kayıt olan bir yapıda tüketilen ram miktarı 30 MB bile değildir. Siz varsayılanı kullanın ya da 1GB olarak ayarlayın.

Konumuzda memcached'in sunucunuzda kurulu ve aktif olduğunu varsayıyoruz.

Öncelikle memcached'i kütüphanenizde veya sürekli include ettiğiniz sayfalarınızdan bir tanesinde açınız.

$m = new Memcached();

Daha sonra memcached sunucularını eklemelisiniz. Bir'den fazla memcached sunucusu kullanabilirsiniz. Bunun yapılandırması bir miktar farklı. Ama local sunucu üzerinde ise, şu şekilde sunucuyu ekliyoruz.

$m->addServer("127.0.0.1", 12111, 10);

Burada localhost ya da 127.0.0.1 yazabilirsiniz. İkinci parametre port. Varsayılan port değiştirmediğiniz sürece 12111 olarak verilmiştir. Sondaki parametre ise 1'den fazla memcached sunucusu kullanmanız durumunda öncelik/ağırlık sıralandırması anlamına gelir. Bu parametreyi vermezseniz kendisi en uygun sunucuyu seçecektir. Örneğimizde tek sunucu olduğu için bu parametreyi vermemizin bir anlamı kalmıyor.

Tanımlamamızı yaptıktan sonra artık memcached'e bir "key" vererek içerisinde veri atabiliriz. Konumuzda vereceğimiz memcached örnekleri şunlar olacaktır:

  • Memcached set ile veri kaydetme
  • Memcached get ile veri okuma
  • Memcached delete ile veri silme
  • Memcached flush ile tüm RAM'i temizleme

Memcached set ile veri kaydetme

SQL sorgularınızı, statik verilerinizi veya herhangi bir veriyi memcached üzerine atabilirsiniz. Bunun için şu kodu kullanıyoruz.

PHP.net üzerinde yer alan fonksiyonun açılımına göre;

public Memcached::set ( string $key , mixed $value [, int $expiration ] ) : bool

Basit hali ile şu şekilde kullanıyoruz:

$m->set("key", "value", "süre");
$m->set("ayarlar", $ayarlar, time() + 60*60*24); // Şu andan itibaren 24 saat cache'de duracaktır. Burada $ayarlar array, object, string, int vs her şey olabilir.

Peki SQL sorgunuzu nasıl cache'leyeceksiniz? Aşağıdaki örnek üzerinden gidelim.

Ürün detaylarını aldığınız bir sayfanız olduğunu varsayalım. Buradaki SQL sorgusundan dönen değerleri memcache üzerine atarak ve daha sonra memcache üzerinden okuyarak hiç SQL sorgusu atmadan RAM üzerinden hızlıca verileri alabiliriz. Verimiz dinamik olmadığı için, bu veri istediğimiz süre kadar veya sonsuza kadar memcache üzerine kalabilir. Bu örneği diğer yerlerde de kullanacağız.

$query = "select * from urunler where id = 3";

$data = $db->row($query);

$m->set(md5($query), $data); // Key değeri string, boşluksuz, özel karaktersiz olmalıdır. Bu yüzden md5'leyerek atıyoruz. Siz dilerseniz başka bir şekilde atabilirsiniz. Süre belirtmediğimiz için sonsuza kadar tutacaktır.

DİKKAT: Memcache key'iniz benzersiz olmalıdır. Aynı key üzerine tekrar yazarsanız overwrite edecektir.

 

Memcached get ile veri okuma

Memcache üzerine attığımız bir veriyi okumak için kullanırız.

PHP.net üzerinde yer alan fonksiyonun açılımına göre;

public Memcached::get ( string $key [, callable $cache_cb [, int $$flags ]] ) : mixed

Basit hali ile şu şekilde kullanıyoruz:

$m->get("key_adi"); // Bu bize içerisinde saklı olan data tipi ile verecektir.

Peki üstte SET ederken verdiğimiz örneği hem okumak hem de cache'de yoksa yazmak istersek;

$query = "select * from urunler where id = 3";

$data = $m->get(md5($query)); // Bu bize zaten içerisine attığımız data tipi ile döndüreceği için, cache üzerinde varsa $data değişkeni ile aynı şekilde kullanacağız.

if ($data === false) { // eğer bu key ile veri yoksa normal SQL sorgumuz çalıştıralım ve içerisine girdiğinde set'leyelim.

$data = $db->row($query);

$m->set(md5($query), $data);

}

Memcached delete ile veri silme

Memcache üzerine attığımız bir veriyi key verecek silmek için kullanırız. Bunu genellikle, atadığımız key üzerindeki değer değiştiği zaman uygularız. Örneğin, ürünlerinizin fiyatlarında veya açıklamalarında bir değişiklik olduysa, o ürünü memcache'e hangi key ile kaydettiysek o veriyi aynı zamanda silmemiz gerekir.

$m->delete("ayarlar"); // ayarlar adı ile atadığımız veriyi cache'den siler.

Memcached flush ile tüm RAM'i temizleme

Memcache üzerindeki tüm verileri silmek için kullanırız. Ama bunu kesinlikle tavsiye etmem çünkü uygulamanız çalıştığında tekrar kod yapınızdaki tüm cache'leri kaydetmeye çalışacağı için, bu zaman içerisinde SQL sorgularınız tekrar çalışacak ve sunucu üzerine gereksiz bir yük getirecektir. Bunun yerine daha uygulanabilir, değişen veri ne ise onun için atanmış key'i silmelisiniz.

$m->flush();

 

Daha profesyonel bir şekilde memcache üzerindeki key'leri yönetmeniz gerekmektedir. Bunu ancak iyi key atamaları ve alt yapınıza iyi entegre ederek yapabilirsiniz. Size verdiğim bu basit örnek ile bile net bir şekilde %50 performans sağlayabilirsiniz.

RAM üzerinden veri okumanın harddisk üzerindeki bir veriyi okumaktan daha hızlı olduğunu biliyoruz. Ayrıca memcache ile MySQL sunucunuz üzerine yük götürmenize gerek kalmaz. Tek yapmanız gereken iyi bir kurgu.

 

Unutmayın! Sunucunuz restart edildiğinde RAM üzerindeki memcached'e ait tüm veriler silinir ve uygulamanız (websiteniz vs) tekrar çalıştığında veriler cache'lenmeye başlar.

 

Memcache ile ilgili istatistiklerin ve bazı ayarların online olarak bir arayüzden yapılmasını tercih etmek isterseniz, PHPMemcachedAdmin uygulamasını bir yere atıp çalıştırabilirsiniz.

 

Konuya Oy Verin
5/5

1 Yorum

  1. gravatar

    Hocam sitemiz çok yavaş araştır araştır memcache denen şeyi buldum bize yardımcı olabilir misiniz?mailden ulaşabilirsini. Kolay gelsin.

Yorum Yazın