Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Rails.cache.instance_variable_get(:@data).keys

Ответ 3

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

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

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