我正在使用Rails 3。
如何在Ruby on Rails上列出内存缓存存储中的密钥?
答案 0 :(得分:79)
Rails.cache.instance_variable_get(:@data).keys
答案 1 :(得分:32)
ActiveSupport::Cache::MemoryStore没有提供直接访问商店密钥的方法(父类ActiveSupport::Cache::Store也没有。)
内部MemoryStore会将所有内容保存在名为@data
的哈希中,但是,您可以对其进行修补或子类化以获取密钥,例如:
class InspectableMemoryStore < ActiveSupport::Cache::MemoryStore
def keys
@data.keys
end
end
ActionController::Base.cache_store = InspectableMemoryStore.new
Rails.cache.keys # => [ "foo", ... ]
然而,这通常需要注意:MemoryStore的内部实现可能会随时更改,@data
可能会消失或更改为不respond_to? :keys
的内容。更智能的实现可能是覆盖write
和delete
方法(因为,作为公共API的一部分,它们不太可能意外地更改)以保留您自己的密钥列表,例如:
class InspectableMemoryStore < ActiveSupport::Cache::MemoryStore
def write *args
super
@inspectable_keys[ args[0] ] = true
end
def delete *args
super
@inspectable_keys.delete args[0]
end
def keys
@inspectable_keys.keys
end
end
这是一个非常天真的实现,当然将密钥保存在一个额外的结构中会占用一些内存,但是你得到了要点。
答案 2 :(得分:3)
在Rails 6中,Redis用作缓存存储
Rails.cache.redis.keys
答案 3 :(得分:1)
如果您不需要动态访问密钥,则更简单的方法是查找存储缓存的目录。为每个条目创建一个文件。
在我的情况下,这是在“APP_ROOT / tmp / cache”,但您可以通过转到rails控制台并输入
轻松找到它1.8.7 :030 > Rails.cache.clear
=> ["path_to_rails_app/tmp/cache/6D5"]
答案 4 :(得分:0)
获取所有密钥:
Rails.cache.data.keys
读取特定密钥
Rails.cache.read("cache_key")
从键中删除一个键:
Rails.cache.delete("cache_key")
刷新键
Rails.cache.clear