2012-03-07 19 views

答えて

27

ActiveSupport::Cache::MemoryStoreは、ストアのキーに直接アクセスする方法を提供していません(親クラスActiveSupport::Cache::Storeもありません)。

class InspectableMemoryStore < ActiveSupport::Cache::MemoryStore 
    def keys 
    @data.keys 
    end 
end 

ActionController::Base.cache_store = InspectableMemoryStore.new 

Rails.cache.keys # => [ "foo", ... ] 

しかしこれは、通常の警告が付属しています:MemoryStoreの内部あなたは猿パッチできたかのキーを取得するには、それをサブクラスよう

内部MemoryStoreは、しかし、@dataと呼ばれるハッシュに例えば、すべてを保持します実装はいつでも変更される可能性があり、@dataが消えたり、respond_to? :keys以外のものに変更される可能性があります。これは

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 

:賢く実装はwritedelete方法(パブリックAPIの一部として、彼らは予期せず変更する可能性は低いです、ので)例えば、キーの独自のリストを維持するために上書きするかもしれません非常に純粋な実装であり、もちろんキーを追加の構造に保つことはいくらかのメモリを消費しますが、あなたは要点を得ることができます。

+0

を入力して、それを見つけることができます。それはトリック、大きな感謝を行う! – Nerian

+0

'ActionController :: Base.cache_store = InspectableMemoryStore.new'を設定したファイルは何ですか? – Paul

+2

@Paul環境ファイル(例: 'config/environment/development.rb'です。それが 'Rails.application.configure do ... end'ブロックの中にある場合、' config.cache_store = InspectableMemoryStore.new'になります。 – jwadsack

1

キーに動的にアクセスする必要がない場合は、キャッシュが格納されているディレクトリを簡単に見つけることができます。エントリごとにファイルが作成されます。私の場合は

これは「APP_ROOTを/ tmp /キャッシュ」にあったが、あなたは簡単に、私はちょうど、キーの名前をチェックしたいコンソールをレールに行くと

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

しかし、あなたのソリューションは、ファイルcache.ifを使って私がバックエンドキャッシュとしてmemcachedを使用しているときにしか動作しませんでしたが、これは動作しません。 – qichunren

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

これはRails 4で動作するかわかりません – fenec

+1

Rails 4.2とファイルストアキャッシュでは動作しません – eprothro

+4

Rails 4.2.2でredis-railsを使用して動作します –

関連する問題