rails如何使用部分匹配删除缓存键

Mun*_*sim 16 caching ruby-on-rails

我正在使用redis-rails.对于缓存键我使用的是数组:

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

现在我需要删除与[self.class.name,:translated_attribute,id]的键匹配的所有缓存.我知道delete_matched在部分匹配的密钥之后需要使用通配符(*).

但我不知道生成的确切密钥是什么.现在我需要知道当我们使用数组作为键时它是如何产生键的.我的意思是,如果我使用[:foo,:bar,:dum]作为缓存键,那么缓存存储中的确切键是什么?

小智 30

默认的rails缓存密钥格式为:[class]/[id] - [timestamp]

我通常不使用rails默认缓存键格式,而是我创建自己的键,以便更容易在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}*")
Run Code Online (Sandbox Code Playgroud)

  • 小心在生产中使用`delete_matched`:```性能说明:此操作对于大型生产数据库可能是危险的,因为它使用Redis"KEYS"命令,该命令比数据库中的键总数多O(N) .大型Redis缓存的用户应该避免使用这种方法.```.http://www.rubydoc.info/gems/redis-activesupport/4.0.0/ActiveSupport%2FCache%2FRedisStore:delete_matched (4认同)
  • 这不适用于 memcache 作为数据存储。还有其他选择吗? (2认同)
  • @DFish可能新的实现没有这个缺点https://github.com/rails/rails/commit/ef2af628a9ec1cc4e7b6997a021dd3f85cfe4665 https://github.com/rails/rails/blob/9a439f633205af0800f34af32f2122150faa2767/activesupport/lib/active_support/cache /redis_cache_store .rb#L187 (2认同)