desenv-web-rp.com

Existe alguma maneira de invalidar todas as entradas do memcache que começam com "Usuário *"?

Recentemente, fiz uma alteração na minha classe User (que está no cache de memórias); existe alguma maneira de invalidar todas as entradas cuja chave começa com User sem invalidar todo o cache?

Caso contrário, existem soluções alternativas? Prefiro não excluir tudo.

2
Thomas Bonini

No FAQ do memcached , Excluindo por namespace :

Embora o memcached não suporte nenhum tipo de exclusão curinga ou exclusão por namespace (já que não existem espaços para nome), existem alguns truques que podem ser usados ​​para simular isso. Porém, eles exigem viagens extras para os servidores em cache de memcached.

Exemplo, em PHP, para usar um espaço de nome chamado 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 você planeja limpar apenas uma parte do cache, considere definir a validade para um período mais curto.

3
artlung

Como o memcached não possui espaço para nome ou algo como excluir/consultar caracteres curinga, você pode executar este truque: salve todas as chaves iniciando com o espaço para nome "usuário_" em uma chave.

Por exemplo

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

Agora, quando você deseja excluir todas as chaves, começa com "user_", basta obter a chave "user_" primeiro. Ao fazer isso, você tem todas as chaves que deseja excluir

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