2012-03-07 18 views

Respuesta

27

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.

+0

Sólo quería comprobar el nombre de las teclas . Eso hará el truco, ¡muchas gracias! – Nerian

+0

¿Cuál es el archivo donde configuré 'ActionController :: Base.cache_store = InspectableMemoryStore.new'? – Paul

+2

@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

1

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"] 
+5

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

53
Rails.cache.instance_variable_get(:@data).keys 
+1

No estoy seguro de que esto funcione en Rails 4 – fenec

+1

No funciona a partir de Rails 4.2 con un caché de almacén de archivos – eprothro

+4

Funciona con Rails 4.2.2 usando redis-rails –

Cuestiones relacionadas