it-swarm-eu.dev

Existuje nějaký způsob, jak zneplatnit všechny záznamy memcache, které začínají na „Uživatel *“?

Nedávno jsem provedl změnu ve své třídě User (což je memcached); existuje nějaký způsob, jak mohu zneplatnit všechny položky, jejichž klíč začíná User, aniž bych zneplatnil celou mezipaměť?

Pokud neexistují žádná zástupná řešení? Raději bych všechno neodstranil.

2
Thomas Bonini

V FAQ s memcached , Mazání podle jmenného prostoru :

Zatímco memcached nepodporuje žádný typ mazání zástupných znaků nebo jejich mazání podle jmenného prostoru (protože neexistují jmenné prostory), existuje několik triků, které lze použít k simulaci tohoto. Vyžadují však další výlety na memcached servery.

Příklad, v PHP, pro použití jmenného prostoru nazvaného 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");

Pokud plánujete provést deku bez pouhé části mezipaměti, můžete zvážit nastavení vypršení platnosti na kratší časové období.

3
artlung

Protože memcached nemá obor názvů nebo něco jako mazání/dotaz pomocí zástupných znaků, můžete tento trik udělat: uložení všech klíčů začíná jmenným prostorem "user_" v klíči.

Například

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

Nyní, když chcete smazat všechny klíče začínající na „user_“, stačí nejprve získat klíč „user_“. Tím získáte všechny klíče, které chcete odstranit

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