it-swarm-es.com

¿Hay alguna forma de invalidar todas las entradas de memcache que comienzan con "Usuario *"?

Recientemente realicé un cambio en mi clase de Usuario (que es memcached); ¿Hay alguna forma de invalidar todas las entradas cuya clave comienza con User sin invalidar todo el caché?

Si no, ¿hay alguna solución? Prefiero no borrar todo.

2
Thomas Bonini

En Preguntas frecuentes sobre memcached , Eliminar por espacio de nombres :

Si bien memcached no admite ningún tipo de eliminación de comodines o eliminación por espacio de nombres (ya que no hay espacios de nombres), existen algunos trucos que pueden usarse para simular esto. Sin embargo, requieren viajes adicionales a los servidores memcached.

Ejemplo, en PHP, para usar un espacio de nombres llamado foo:

$ns_key = $memcache->get("foo_namespace_key");
// if not set, initialize it
if($ns_key===false) $memcache->set("foo_namespace_key", Rand(1, 10000));
// cleverly use the ns_key
$my_key = "foo_".$ns_key."_12345";
$my_val = $memcache->get($my_key);

//To clear the namespace do:
$memcache->increment("foo_namespace_key");

Si planea hacer una limpieza general de solo una parte de la memoria caché, puede considerar establecer la caducidad en un período de tiempo más corto.

3
artlung

Como memcached no tiene espacio de nombres o algo así como eliminar/consultar mediante comodines, puede hacer este truco: guardar todas las claves comienza con el espacio de nombres "usuario_" en una clave.

Por ejemplo

$keys = array('user_1', 'user_2', 'user_3');
$memcache->set('user_', $keys);

Ahora, cuando desee eliminar todas las claves comienza con "usuario_", primero obtenga la clave "usuario_". Al hacerlo, tiene todas las claves que desea eliminar

$all_keys = $memcache->get('user_');
if($all_keys){
    foreach($all_keys as $key){
        $memcache->delete($key);
    }
}
2
Ha Doan Ngoc