memcached-logo-200x152

Memcache kullanarak web sayfalarını ölçeklendirmek

Web ortamı her geçen gün genişliyor. Gece ve gündüz dünyanın her yerinden insanlar web sayfalarını ziyaret ediyor, yorum yapıyor veya paylaşımlarda bulunuyorlar. Normal bir zamanda siteniz günde birkaç yüz ziyaretçi alıyor olabilir (en iyi zamanda belki birkaç bin), peki bir gün bu sayı artarsa ne yapacaksınız ? Veritabanı veya web sunucunuz bu yükü kaldırabilecek mi […]

Web ortamı her geçen gün genişliyor. Gece ve gündüz dünyanın her yerinden insanlar web sayfalarını ziyaret ediyor, yorum yapıyor veya paylaşımlarda bulunuyorlar. Normal bir zamanda siteniz günde birkaç yüz ziyaretçi alıyor olabilir (en iyi zamanda belki birkaç bin), peki bir gün bu sayı artarsa ne yapacaksınız ? Veritabanı veya web sunucunuz bu yükü kaldırabilecek mi ? Eğer cevabınız hayırsa, önbellekleme yapmanın vakti geldi demektir.

Memcached

Memcached’ın oldukça basit bir konsepti var. İsminden de anlaşılacağı gibi memcached (memory+cache) önbellekleme işlemini memory üzerinde yapan bir uygulama. Bu temel bilgi şimdilik size yeterli olacaktır. Bana bu kadar bilgi yetmez daha fazlasını isterim derseniz sizi şuraya alalım…

PHP Memcache

Daha önceki makelelerimden de göreceğiniz gibi PHP ile aramızda “düzeyli” bir ilişki mevcut dolayısı ile bu makalemdeki çözümü de PHP üzerinden anlatacağım. Muhtemelen her programlama dili için benzer çözümler mevcuttur. Uygulamızın temelinde memcached bulunduğuna göre işe önce memcached sunucusunu php5 modülünü kurarak başlayabiliriz. Bu kurulum için web üzerinde binlerce doküman bulunuyor ama Ubuntu kullanıcıları kurulum işini şu komutla halledebilirler :

apt-get install memcached php5-memcache

Adım 1 : PHP ile bağlan memcached’a !

Bu kısım kısa ve öz. Eğer önbellekleme sunucusuna bağlanamazsanız, önbellekleme yapamazsınız. Eğer bağlantı başarılıysa sorgulamayı önbellek üzerinden yaparsınız yoksa da her zamanki gibi veritabanınız üzerinden.

$memcache = new Memcache;
$memcache->connect(“127.0.0.1”, 11211); // ilk parametre memcached sunucusunuz ip adresidir. Yerel makinanız üzerinde çalıştığınız düşünerek 127.0.0.1 olarak belirttim. İkinci parametre ise memcached sunucusunun çalıştığı port ayarıdır.

Adım 2 : Önbelleğe birşeyler atalım

Bu adım için en önemli bilinmesi gereken nokta her tanımlayıcının (identifier) benzersiz olması gerekliliğidir. Ayrıca set fonksiyonunun son parametresi verinin önbellekte tutulma süresini saniye cinsinden belirtmektedir. 60*60*24 gibi bir değer verdiğinizde bu 1 güne yani 24 saati belirtmektedir.

$value = “Hello kitty!”;
$memcache->set(“benzersiz_tanimlayici”, $value, false, 60*60*24);

Adım 3 : Önbellekten veri çağırma

$value = $memcache->get(“benzersiz_tanimlayici”);
echo $value; // Hello kitty! sonucunu döndürmesi gerekmektedir.

Adım 4 : Hepsini bir araya toplayalım

Sonuç itibari ile bu çözümü kendi uygulamalarınızda da yapabilmeniz için aşağıdakine benzer bir iş akışı planlayabilirsiniz.

  1. Çağırdığım veri önbellekte mevcut mu ? (Bu kontrol önbellek sunucusuna yapılmış geçerli bir bağlantı varsa yapılabilecektir. )
  2. Eğer varsa veriyi önbellekten oku.
  3. Eğer yoksa veriyi önbelleğe yaz.
  4. Sonraki kullanımlar için veriyi önbellekte sakla.

$memcache = new Memcache;
$memcache->connect (“benzersiz_tanimlayici”, 11211);

$array = $memcache->get(“benzersiz_tanimlayici”);

if (!$array) {
$query = “SELECT * FROM tabloadi”;
$result = mysql_query($query);
while($row = mysql_fetch_array($result)){
$array[] = $row;
}
$memcache->set(“benzersiz_tanimlayici”, $array, false, 60*60*24);
}

foreach($array as $val) {
print_r($val);
}

Eğer yukarıda yazılı olanları dikkatlice uyguladıysanız, göreceksiniz ki veritabanınıza yapılan istekler minimuma inecektir. Veritabanına yapılan tek bir sorgu sonucunda verileriniz önbellekte 24 saat süreyle tutulacaktır.

Bu temel bir önbellek uygulaması olarak düşünülebilir bunu genişletmek sizin elinizdedir. Örneğin veritabanınızda bir değeri güncellediğinizde memcache üzerindeki verileri de güncellemeniz gerekecektir. Bu ister siz guncelleme işlemi içinde memcache alanını temizleyip yeni verileri yaparak isterseniz de sadece memcache alanını temizleyip bir sonraki istekte otomatik olarak memcache üzerine yazılmasını sağlayarak yapabilirsiniz.