如何在Ruby on Rails上的内存缓存存储中列出密钥?

时间:2012-03-07 13:21:03

标签: ruby-on-rails

我正在使用Rails 3。

如何在Ruby on Rails上列出内存缓存存储中的密钥?

5 个答案:

答案 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的内容。更智能的实现可能是覆盖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

这是一个非常天真的实现,当然将密钥保存在一个额外的结构中会占用一些内存,但是你得到了要点。

答案 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