Внутренне 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", но вы можете легко найти его, перейдя на консоль рельсов и набрав