Я использую Rails 3.
Как я могу перечислить ключи в хранилище кеш-памяти в Ruby on Rails?
Я использую Rails 3.
Как я могу перечислить ключи в хранилище кеш-памяти в Ruby on Rails?
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
Это очень наивная реализация, и, конечно, сохранение ключей в дополнительной структуре занимает некоторую память, но вы получаете суть.
Rails.cache.instance_variable_get(:@data).keys
Если вам не нужно динамически обращаться к ключам, проще всего найти каталог, в котором хранится кеш. Для каждой записи создается файл.
В моем случае это было в "APP_ROOT/tmp/cache", но вы можете легко найти его, перейдя на консоль рельсов и набрав
1.8.7 :030 > Rails.cache.clear
=> ["path_to_rails_app/tmp/cache/6D5"]