/ cache

Rails'te Memcached kullanımı

Performanslı bir uygulamanın olmazsa olması olan Memcached‘ın, Ruby on Rails’teki kullanımını göreceğiz. Memcached, Facebook dahil bir çok büyük internet siteleri tarafından kullanılmış, tampon bellek sistemidir. Veritabanı gibi ekstra kaynak gerektiren uygulamalarla yapılan veri alışverişini RAM’de tutarak işlemin daha hızlı yapılmasını amaçlamaktadır. RAM’de tutulacağı süre bitene kadar veriler RAM’den çekilmeye devam eder.

Öncelikle Memcached’i platformumuza kurmamız gerekiyor.

OS X için:

brew install memcached
memcached -d

Ubuntu/Debian için:

apt-get install memcached

Ruby’e bir kütüphane kuracaksak tavsiyem RVM kullanmanız. RVM sayesinde Ruby’i sistemdekinden bağımsız olarak kullanabiliyorsunuz. Bu sayede her proje için ayrı Ruby versiyonu ve kütüphaneleri kullanabiliriz. Ruby’de Memcached kullanabilmemiz için dalli isimli kütüphane bulunuyor. Kurmak için;

Gemfile dosyasına ekleyelim:

gem 'dalli'

Ya da konsola yazalım:

gem install dalli

Şimdi Rails’e ekleyelim. Bunun için /app/conig/environments/production.rb dosyamızı açıyoruz ve şunu ekliyoruz:

config.perform_caching = true
config.cache_store = :dalli_store, nil, { :namespace => 'proje_ismi', :expires_in => 1.day, :compress => true }

Aynısını development.rb dosyasına da ekliyoruz. Kurulum bitti. Rails’i yeniden başlatıp Memcached kullanımına başlayabiliriz.

Örnek olarak giriş yapmış kullanıcınun bilgilerini çekeceğiz ve bu datayı her defasında veritabanından çekmek zorundayız. Üye bilgilerinin bulunduğu değişken @user olsun diyelim.

@user = User.find_by_id(1)

Şimdi de bu bilgileri cache’letelim:

Rails.cache.fetch('/users/1', :expires_in => 1.days) do
  User.find_by_id(1)
end
@user = Rails.cache.read('/users/1')

Burada /users/1 adında bir cache key tanımladık ve bitiş süresini de 1 gün ayarladık. Rails.cache’in “fetch” methodu, eğer /users/1 key tanımlanmamışsa kolon içerisindeki sonucu key’e tanımlar, eğer tanımlanmışsa sonuç döndürmeyi es geçer. “read” methodu ise key’e tanımlanan veriyi Memcached’dan okur. Bu sayede her seferinde veritabanı sorgusundan kurtulmuş oluyoruz.

Dikkat edilmesi gereken nokta daha var. Örneğin üye, bilgilerini güncellerse bu key’i silmemiz ve yeniden tanımlamamız gerekiyor. Key silmek için “delete” methodunu kullanıyoruz.

Rails.cache.delete('/users/1')