2012-03-07 79 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