Estoy usando Rails 3.¿Cómo puedo enumerar las claves en la memoria caché en memoria en Ruby on Rails?
¿Cómo puedo enumerar las claves en la memoria caché en memoria en Ruby on Rails?
Estoy usando Rails 3.¿Cómo puedo enumerar las claves en la memoria caché en memoria en Ruby on Rails?
¿Cómo puedo enumerar las claves en la memoria caché en memoria en Ruby on Rails?
ActiveSupport::Cache::MemoryStore no proporciona una forma de acceder directamente a las claves de la tienda (y tampoco lo hace su clase principal ActiveSupport::Cache::Store).
Internamente MemoryStore mantiene todo en un hash llamado @data
, sin embargo, por lo que podría mono-parche o subclase para conseguir las llaves, por ejemplo:
class InspectableMemoryStore < ActiveSupport::Cache::MemoryStore
def keys
@data.keys
end
end
ActionController::Base.cache_store = InspectableMemoryStore.new
Rails.cache.keys # => [ "foo", ... ]
Esto viene con la advertencia de costumbre, sin embargo: MemoryStore del interior la implementación puede cambiar en cualquier momento y @data
puede desaparecer o cambiarse a algo que no se respond_to? :keys
. Una aplicación más inteligente podría ser para anular los métodos write
y delete
(ya que, como parte de la API pública, es poco probable que cambie de forma inesperada) para mantener su propia lista de claves, por ejemplo:
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
Esta es una la implementación muy ingenua, y por supuesto, mantener las claves en una estructura adicional requiere algo de memoria, pero se obtiene la esencia.
Si no necesita acceder a las claves dinámicamente, un enfoque más sencillo es la localización del directorio donde se almacena la memoria caché. Se crea un archivo para cada entrada.
En mi caso esto fue en "apl_raíz/tmp/cache", pero se puede localizar fácilmente por ir a los carriles de la consola y escribiendo
1.8.7 :030 > Rails.cache.clear
=> ["path_to_rails_app/tmp/cache/6D5"]
Pero su solución solo funcionó cuando se almacenó el caché de archivos. Si utilizo memcached como caché de back-end, esto no funciona. – qichunren
Sólo quería comprobar el nombre de las teclas . Eso hará el truco, ¡muchas gracias! – Nerian
¿Cuál es el archivo donde configuré 'ActionController :: Base.cache_store = InspectableMemoryStore.new'? – Paul
@Paul En sus archivos de entorno, p. 'config/environment/development.rb'. Si está dentro del bloque 'Rails.application.configure do ... end', entonces sería' config.cache_store = InspectableMemoryStore.new'. – jwadsack