16 Mayıs 2014 Cuma

Caching

Caching yani ön bellekleme. Bu bu yazıda daha basit ve uygun olduğu için caching ifadesini kullanacağız. Caching daha sonra kullanmak üzere belirli bir yerde saklama işlemidir. Dinamik sitelerde kullanıcıya veriler gösterilirken veri tabanı bağlantısı , sorgulamalar , hesaplamalar gibi bir çok işkemden geçirilir. Eğer sitenin trafiği çok yüksek değilse sunucu bu işlemleri her seferinde yapmakta zorlanmayabilir. Fakat site trafiğinin çok yüksek olduğu durumlarda bu işlemler sunucuya ağır gelerek cevap veremeyeceği bir hal almasını sebep olabilir. İşte bu işlemlerin her seferinde tekrar tekrar yapmak yerine bir kere yaptıktan sonra saklayarak, bu saklanılan verinin kullanılmasına caching diyoruz.
Django caching olayını destekleyerek gelir. 3 türdür; Dosya Sistemi, Veritabanı ve bellek.
Dosya Sistemi
Sayfaların oluşturulduktan sonra bir anahtarlama şifresi ile dosya sistemine kaydedilerek aynı sayfanın tekrar istenilmesi durumunda bu dosyadan çağrılması durumudur. Bu kullanım için projenin settings.py dosyasına şu kodları ekliyoruz.
CACHES = {
    'default':{
        'BACKEND'   : 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION'  : '/home/mazlum/caching/'
    }
}
Burada CACHES değişkeni ile kullanacağımız caching yöntemini ve parametrelerini giriyoruz. Sözlük içerisindeki BACKEND anahtarı ile hangi caching yöntemini kullanacağımızı belirtiyoruz. LOCATION anahatarı ile ise dosyanın yolunu belirtiyoruz. Eğer windows kullanıyorsanız sizde şöyle bir şey olabilir.
'LOCATION' : 'C:/caching'
Veya daha önceden sıkça kullandığımız proje dizinini belirtebiliriz. Bunun için şu şekilde kullanabiliriz.
CACHES = {
    'default':{
        'BACKEND'   : 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION'  : os.path.join(ustDizin,'caching')
    }
}
Şimdi ayarlamayı yaptık. Kontrol etmek için Django kabuğunu kullanabiliriz. Django kabuğunu açarak şu kodları yazabilirsiniz.
>>>from django.core.cache import cache
>>>cache.set('anahtar','Ilk Caching',30)
>>>cache.get('anahtar')
Ilk Caching
İlk parametre olarak saklanacak verinin anahtarını ardından da değerini belirtiyoruz. Sayı ile belirttiğimiz kısım ise bu anahtarın ne kadar süre saklanacağını belirtiyor. Saniye cinsinden değer giriyoruz. Eğer 30 saniye geçtikten sonra tekrar cache.get('anahtar') ifadesini yazarsanız herhangi bir sonuç dönmediğini göreceksiniz. Dosya sisteminde belirttiğiniz yolda dosyalar oluştuğunu görebilirsiniz. Aynı şekilde belirttiğiniz süre bittikten sonra dosyalar silinecektir.
Veritabanı
settings.py dosyasında yaptığımız işlemler aynı olacak. Az önce bir dosya yolunu belirtmiştik. Burada ise saklama veri tabanına yapılacağı için ilk önce verilerin saklanacağı tabloyu oluşturmamız gerekiyor. Bunun için komut satırından şu komutu veriyoruz.
python manage.py createcachetable caching_table
Verilerin saklanacağı tabloyu oluşturduk. settings.py dosyasına şu kodları yazıyoruz.
CACHES = {
    'default':{
        'BACKEND'   : 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION'  :  'caching_table',
    }
}
BACKEND anahtarı ile veritabanı caching yapacağımızı belirttik. LOCATION anahtarına az önce oluşturduğumuz tabloyu yazdık. Az önce yaptığımız yöntemin aynısını kullanarak kontrol edebilirsiniz.
Bellek
En hızlı Caching yöntemidir. Yapılan saklamaların hepsi bellektedir. Bu yüzden sistem kapatıldığında hepsi silinir. Bellek boyutu ne kadar büyük ise o kadar iyi caching yapılır.
Yerel Bellek
Yerel bellek caching'de Django'nun çalıştığı makinede caching yapılır. Bu caching için settings.py dosyasına yazmamız gerenler şunlar.
CACHES = {
    'default':{
        'BACKEND'   : 'django.core.cache.backends.locmem.LocMemCache',
    }
}
Dağıtık Bellek
Bellek zulalama en çok memcached sunucusu ile yapılır. Bu sunucu ile bir makineye birden çok istemci bağlantı kurabilir veya projeye birden çok caching sunucusu kurulabilir. Yerel makine web isteklerini karşılarken caching işlemi ile başka bir makine yapar.
memcached ilk önce kurmalıyız. Bunun için Linux'da şu komutları verebilirsiniz
$ sudo apt-get install memcached
$ sudo apt-get install python-memcache
Windows kullananlar buradan indirdikten sonra çıkarttıkları dizine gelerek yönetici olarak komut satırından şu komutu vermeliler.
memcached.exe -d install
Ardından yönetici olarak windows kontrol panelini açarak Sistem ve Güvenlik->Yönetimsel Araçlar->Hizmetler uygulamasını açın. memcached'i bularak üzerine çift tıklayın. Bu şekilde hizmeti başlatmış olacaksınız. Bilgisayarı yeniden başlattığınız da otomatik başlamısı için başlangıç türü Otomatik olmalıdır. Her şey doğru ise komut satırından netstat -ab yazdığınızda şöyle bir çıktı alacaksınız.
UDP    0.0.0.0:11211        *:*
[memcached.exe]
Şimdi python için memcached'i kuralım. İlk önce buradan memcached'ı indiriyoruz. Ardından dosyayı çıkarttığımız dizine girerek şu komutu veriyoruz.
python setup.py install
Kurulum işlemleri bu kadar. Şimdi settings.py dosyasında tanımlamaları yapabiliriz. Daha önce yaptıklarımızdan pek bir farkı yok aslında.
CACHES = {
    'default':{
        'BACKEND'   : 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION'  : '127.0.0.1:11211',
    }
}
Burada Location olarak belirttiğimiz ip adresi caching işleminin yapılacağı makineyi belirtiyor. Bizim ki yerel makine olduğu için bu şekilde belirttik. Birden fazla makine tanımlayabilirsiniz.
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
            '172.19.26.240:11211',
            '172.19.26.242:11211',
        ]
    }
}
Şimdi caching işlemini uygulayalım. İki şekilde caching yapabiliriz. Tüm siteye veya istenilen görünümlere.
Tüm siteye
Tüm siteye caching yapmak için aşağıdaki kodları settings.py dosyasında MIDDLEWARE_CLASSES deişkenine şu kodları ekliyoruz.
#...
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
#...
Projenizi yeniden başlattığınızda caching işlemi başlayacaktır. Sayfalar artık bellekten çekilecektir.
Görünümlere
Sadece belli görünümlere caching uygulamak isterseniz görünüm başına şu satırları yazabilirsiniz.
from django.views.decorators.cache import cache_page
@cache_page(60)
def gorunum_islevi(request):
    ....
Burada belirttiğimiz caching işleminin 60 saniye boyunca yapılacağını belirtiyor. Caching yapılırken eğer görünümler üzürinden yapacaksanız parametre olarak ön bellek adı belirtebilirsiniz. Eğer belirtilmezse varsayılan ön bellek kullanılır.
@cache_page(60,cache="cache_ismi")
def gorunum_islevi(request):
    ....
Yazının en başında belirtmiştik dosyalar kaydedilirken bir anahtara göre şifrelenerek kaydedilir. Burada parametre olarak bu anahtarı da verebiliriz.
@cache_page(60,key_prefix="anahtar")
def gorunum_islevi(request):
    ....
Görünümlere URL üzerinden Caching
Eğer istersek görünümlere caching yapma işlemini doğrudan url üzerinden yapabiliriz.
from django.views.decorators.cache import cache_page

urlpatterns = ('',
    (r'^gorunum-url/$', cache_page(60)(gorunum_islevi)),
)
Şablon İçerisinde Caching
Bazen daha da ayrıntıya girerek şablon içerisinde sadece belli bir bölüm üzerine caching yapmak isteyebiliriz. Bunu için kullanım yapısı şu şekildedir.
    {% load cache %}
    {% cache 2 ogranci_adi_onbellek %}

     {{ogrenci.adi}} 

    {% endcache %}
Burada ilk önce cache dahil edilir. Ardından
{% cache ..%}
...
{% endcache %}
ifadeleri arasına cache alınacak ifadeler yazılır. cache ifadesi en az iki paremetre alır. İlki cachhing süresi ikincisi ise adıdır. Örneğin bizim daha önce yaptığımız öğrenci listesi görünümünde öğrenci adını cacheden çekiyoruz. Eğer siz de denerseniz tüm öğrenci isimlerinin aynı olduğunu görebilirsiniz. Çünkü ilk öğrenci çekilirken öğrenci adı cache atılıyor ve her seferinde artık buradan çekiliyor. Kaynakça

1 yorum :

  1. Yorumlarımıza değer verip anlatım önceliğinizi değiştirmeniz çok takdire şayan bir davranış şahsım adına teşekkür ederim.Birde bir sorum var sizce memcache mi redis mi ?

    YanıtlayınSil