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

Ner*_*ian 35 ruby-on-rails

我正在使用Rails 3.

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

小智 88

Rails.cache.instance_variable_get(:@data).keys
Run Code Online (Sandbox Code Playgroud)

  • `Rails.cache.instance_variable_get("@ data")`适用于Rails 4和Dalli :) (11认同)
  • 与Dalli gem的Rails 4.2.3不兼容. (7认同)
  • 使用redis-rails与Rails 4.2.2一起使用 (5认同)
  • 从带有文件存储缓存的 Rails 4.2 开始不起作用 (2认同)
  • 与Rails 4.2一起使用内存缓存 (2认同)

Jor*_*ing 32

ActiveSupport :: Cache :: MemoryStore没有提供直接访问商店密钥的方法(它的父类ActiveSupport :: Cache :: Store也没有).

在内部,MemoryStore会将所有内容保存在一个Hash @data中,因此,您可以对其进行修补或子类化以获取密钥,例如:

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

ActionController::Base.cache_store = InspectableMemoryStore.new

Rails.cache.keys # => [ "foo", ... ]
Run Code Online (Sandbox Code Playgroud)

然而,这通常需要注意: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
Run Code Online (Sandbox Code Playgroud)

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

  • @Paul在您的环境文件中,例如`config/environment/development.rb`.如果它在`Rails.application.configure do ... end`块内,那么它只是`config.cache_store = InspectableMemoryStore.new`. (2认同)

Ant*_*ony 5

在 Rails 6 中,Redis 用作缓存存储

Rails.cache.redis.keys
Run Code Online (Sandbox Code Playgroud)