ActiveSupport::Cache::MemoryStore没有提供直接访问store 密钥的方法(其父类ActiveSupport::Cache::Store也没有).
内部MemoryStore将所有内容保存在一个名为@data
的散列中,因此您可以对其进行monkey patch或子类化,以获取密钥,例如:
class InspectableMemoryStore < ActiveSupport::Cache::MemoryStore
def keys
@data.keys
end
end
ActionController::Base.cache_store = InspectableMemoryStore.new
Rails.cache.keys # => [ "foo", ... ]
然而,这也带来了通常的警告:MemoryStore的内部实现可能随时发生变化,@data
可能会消失或被更改为不存在的内容.更智能的实现可能是覆盖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
这是一个非常幼稚的实现,当然,将密钥保存在一个额外的 struct 中会占用一些内存,但您可以理解其中的要点.