2013-10-26 33 views
9

我正在使用redis-rails。對於緩存鍵我使用一個數組:rails如何使用部分匹配刪除緩存鍵

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

現在我需要刪除所有與密鑰相匹配的緩存與[self.class.name,:translated_attribute,ID]。我知道它有delete_matched,它採用通配符(*)作爲部分匹配的關鍵字。

但我不知道什麼是確切的關鍵生成。現在我需要知道當我們使用數組作爲關鍵時它是如何產生密鑰的。我的意思是如果我使用[:foo,:bar,:dum]作爲緩存鍵,那麼緩存存儲中的確切鍵是什麼?

回答

22

默認軌道緩存鍵格式爲:[類]/[ID] - [時間戳]

我不經常使用的軌道默認的緩存密鑰格式,而不是創建自己的密鑰,這樣它會更容易操縱在redis中。

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

這不適用於作爲數據存儲的memcache。任何其他選項? –

+0

注意在生產中使用'delete_matched': '''性能說明:這個操作對於大型生產數據庫可能是危險的,因爲它使用Redis的「KEYS」命令,這個命令是O(N)在數據庫中。大型Redis緩存的用戶應該避免使用這種方法.''' http://www.rubydoc.info/gems/redis-activesupport/4.0.0/ActiveSupport%2FCache%2FRedisStore:delete_matched – DFish