Как я могу перечислить ключи в хранилище кэша в памяти на Ruby on Rails? - PullRequest
34 голосов
/ 07 марта 2012

Я использую Rails 3.

Как мне перечислить ключи в хранилище кэша в памяти на Ruby on Rails?

Ответы [ 3 ]

83 голосов
/ 11 февраля 2014
Rails.cache.instance_variable_get(:@data).keys
32 голосов
/ 07 марта 2012

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. Более разумная реализация может заключаться в том, чтобы переопределить методы write и delete (поскольку, как часть общедоступного 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

Это очень наивная реализация, и, конечно, хранение ключей в дополнительной структуре требует некоторой памяти, но вы понимаете суть.

1 голос
/ 29 ноября 2012

Если вам не нужен динамический доступ к ключам, проще найти каталог, в котором хранится кеш. Файл создается для каждой записи.

В моем случае это было в "APP_ROOT / tmp / cache", но вы можете легко найти его, перейдя в консоль rails и набрав

1.8.7 :030 >   Rails.cache.clear
 => ["path_to_rails_app/tmp/cache/6D5"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...