web-dev-qa-db-fra.com

Est-il possible d'invalider toutes les entrées memcache commençant par "User *"?

J'ai récemment apporté une modification à ma classe d'utilisateurs (qui est memcached); puis-je invalider toutes les entrées dont la clé commence par User sans invalider la totalité du cache?

Sinon, existe-t-il des solutions de contournement? Je préférerais ne pas tout effacer.

2
Thomas Bonini

Dans la memcached FAQ , Suppression par un espace de noms :

Bien que memcached ne prenne en charge aucun type de suppression générique ni d'effacement par espace de nom (car il n'y a pas d'espaces de nom), certaines astuces peuvent être utilisées pour simuler cela. Ils nécessitent toutefois des déplacements supplémentaires vers les serveurs memcached.

Exemple, en PHP, pour utiliser un espace de noms appelé 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 vous prévoyez de supprimer entièrement une partie du cache, vous pouvez envisager de définir une date d'expiration plus courte.

3
artlung

Comme memcached n'a pas d'espace de nom ou quelque chose comme l'effacement/la requête par caractères génériques, vous pouvez faire cette astuce: enregistrer toutes les clés commence par l'espace de nom "user_" dans une clé.

Par exemple

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

Désormais, lorsque vous souhaitez supprimer toutes les clés, commence par "user_", obtenez simplement la clé "user_" en premier. En faisant cela, vous avez toutes les clés que vous voulez effacer

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