Eski bir yazım vardı kodaman.org‘ta yazdığım. Burayada yazalım, arşive girsin :)
Bilindiği gibi Php ile Memcache kullanılarak veritabanı üzerinden çok fazla yük alınabiliyor. Ayrıca Memcache’nin dağılabilir yapısı bize birçok kolaylık sağlayabiliyor. Örneğin çoklu web sunucularında tek bir Memcache ile veri paylaşımı yapılabiliyor veya çoklu Memcache sunucuları kullanılarak daha sağlam bir cache yapısı kurulabiliyor. Memcache’nin kullanımında başka bir kolaylık sağlayabilecek şey ise MySQL’den direk Memcache’ye erişebilmek, veri okuyup saklayabilmek. Bu yazıda bu işlemin nasıl olduğunu ve kendi yaptığım çeşitli performans testlerini anlatacağım.
Bu işlem yapılırken MySQL’in udf yapısı kullanılıyor. MySQL için Memcache modülünü derleyip, bu modüldeki fonksiyonları oluşturmamız gerekiyor.
http://tangent.org/586/Memcached_Functions_for_MySQL.html
http://tangent.org/552/libmemcached.html
Bu adreslerde bulunan udf eklentisi ile Memcache fonksiyonları kullanılabilir hale geliyor.
Kullanılabilecek Fonksiyonlar:
memc_servers_set()
memc_servers_behavior_set()
memc_set()
memc_get()
memc_append()
memc_prepend()
memc_delete()
Bu fonksiyonları,
CREATE FUNCTION memc_servers_set RETURNS INT SONAME "libmemcached_functions_mysql.so";
şeklinde tanımlayıp kullanabiliyoruz. Bu şekilde MySQL queryleri ile Memcache’ye veri yazabiliyoruz ve okuyabiliyoruz. Bunun sağlayacağı kolaylıklar yapılan işe göre çok çeşitli olabilir.
Ben bu tanımlamaları yaptıktan sonra uygulama aşamasında biraz fikir vermesi için çeşitli hız testleri yaptım.
Bu testleri yaparken 10.000 kayıtlı bir tablo oluşturdum ve bu tablodaki kayıtları Memcache’e aktardım.
select memc_set(isim, deger) from table1;
10.000 kaydın aktarımı yaklaşık 3 saniye sürüyor. Bu şekilde Memcache’ten bir veri çektiğimizde ise 0 saniyelik bir işlemle sonuç dönüyor.
select memc_get('isim3');
Sonuç:
Bu işlemin bir artısı trigger kullanılarak bazı işlemlerin MySQL’e yaptırılıp, Memcache’ye veri girilebilmesi. Bu sayede kod tarafında bir işlem yapılmadan, örneğin herhangi bir veri girişinden sonra, bu veri Memcache üzerinde saklanabilir ve programdan direk okutulabilir. Tabi burada verileri MySQL’den Memcache’e yazıp, sonra okumayı yine MySQL üzerinden yapmak performans açısından sorun yaratacaktır. Yaptığım testlerde, MySQL üzerinden Memcache kullanımı hız açısından çok iyi sonuçlar vermese de uygulanacağı yere gore değişik tipte kullanımlarla çok fazla kolaylık sağlayabilir.