it-swarm.it

Esiste un modo per invalidare tutte le voci memcache che iniziano con "Utente *"?

Di recente ho apportato una modifica alla mia classe User (che è memcached); esiste un modo per invalidare tutte le voci la cui chiave inizia con User senza invalidare l'intera cache?

In caso contrario, ci sono soluzioni alternative? Preferirei non cancellare tutto.

2
Thomas Bonini

Nelle FAQ memorizzate , Eliminazione per spazio dei nomi :

Mentre memcached non supporta alcun tipo di cancellazione o eliminazione di caratteri jolly in base allo spazio dei nomi (poiché non ci sono spazi dei nomi), ci sono alcuni trucchi che possono essere usati per simulare questo. Richiedono comunque viaggi extra ai server memcached.

Esempio, in PHP, per l'utilizzo di uno spazio dei nomi chiamato 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");

Se stai pianificando di eliminare completamente una parte della cache, potresti considerare di impostare la scadenza su un periodo di tempo più breve.

3
artlung

Dato che memcached non ha uno spazio dei nomi o qualcosa come eliminare/interrogare con i caratteri jolly, puoi fare questo trucco: salvare tutte le chiavi inizia con lo spazio dei nomi "user_" in una chiave.

Per esempio

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

Ora, quando si desidera eliminare tutte le chiavi inizia con "user_", basta ottenere prima la chiave "user_". In questo modo, hai tutte le chiavi che vuoi cancellare

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