2013-10-26 18 views
9

Redis raylarını kullanıyorum. önbellek anahtarı için ben bir dizi kullanıyorum: [: translated_attribute, id self.class.name,], kısmi eşlemeyi kullanarak önbellek anahtarını nasıl silebilir

Rails.cache.fetch([self.class.name, :translated_attribute, id, field, I18n.locale]) do 
    self.read_attribute field, locale: I18n.locale 
end 

Şimdi kilit maçlarla tüm önbellek kaldırmak gerekir. Ben kısmi eşleme için anahtar sonra joker (*) alır delete_matched olduğunu biliyorum.

Ama tam olarak üretilen anahtarın ne olduğunu bilmiyorum. Şimdi diziyi anahtar olarak kullandığımızda anahtarın nasıl yapıldığını bilmem gerekiyor. [: Foo,: bar,: dum] önbellek anahtarı olarak kullanırsam, önbellek deposunda tam anahtar ne olacak?

cevap

22

varsayılan raylar anahtar formatını önbelleğe geçerli: [Sınıf]/[id] - yerine ben kendi anahtarlarını oluşturmak o işlemek için daha kolay olurdu böylece [timestamp]

i genellikle varsayılan önbellek anahtarı biçimi kullanımı rayları yok redis içinde.

cache_key = "#{self.class.name}/#{translated_attribute}/#{id}/#{field}/#{I18n.locale}" 

Rails.cache.fetch(cache_key) do 
    self.read_attribute field, locale: I18n.locale 
end 

Rails.cache.delete(cache_key) 
Rails.cache.delete_matched("#{self.class.name}*#{id}*") 
+1

Bu, memcache için veri deposu olarak çalışmaz. diğer seçenekler –

+0

Üretimde 'delete_matched' işlevini kullanırken dikkatli olun: ' '' Performans notu: Bu işlem, büyük üretim veritabanları için tehlikeli olabilir, çünkü Redis “KEYS” komutunu kullanır, bu, toplam anahtar sayısı üzerinden O (N) olur. veritabanında. Büyük Redis önbelleği kullanan kullanıcıların bu yöntemi kullanmaması gerekir. http://www.rubydoc.info/gems/redis-activesupport/4.0.0/ActiveSupport%2FCache%2FRedisStore:delete_matched – DFish

İlgili konular