2012-03-07 40 views

回答

27

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的内容。更智能的实现可能覆盖writedelete方法(因为,作为公共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 

这是一个非常幼稚的实现,当然保持键在一个额外的结构占用一些记忆,但你得到的主旨。

+0

我只是想确认键的名称。这将做的伎俩,非常感谢! – Nerian 2012-03-07 18:09:33

+0

什么是我设置'ActionController :: Base.cache_store = InspectableMemoryStore.new'的文件? – Paul 2014-10-27 13:27:44

+2

@Paul在您的环境文件中,例如'配置/环境/ development.rb'。如果它在'Rails.application.configure do ... end'块内,那么它就是'config.cache_store = InspectableMemoryStore.new'。 – jwadsack 2016-01-10 21:06:21

1

如果您不需要动态访问密钥,更简单的方法是找到缓存存储的目录。为每个条目创建一个文件。

在此我的情况是,在“APP_ROOT的/ tmp /缓存”,但是你可以很容易地将轨道控制台,输入找到它

1.8.7 :030 > Rails.cache.clear 
=> ["path_to_rails_app/tmp/cache/6D5"] 
+5

但是你的解决方案只在文件缓存中起作用。如果我使用memcached作为后端缓存,这是行不通的。 – qichunren 2013-04-07 08:07:42

53
Rails.cache.instance_variable_get(:@data).keys 
+1

不知道这可以在Rails 4中工作 – fenec 2015-01-20 16:42:57

+1

无法像Rails 4.2一样使用文件存储缓存 – eprothro 2015-02-24 16:01:55

+4

使用redis-rails与Rails 4.2.2配合使用 – 2015-07-20 20:50:00