it-swarm.cn

有没有办法使所有以“User *”开头的memcache条目无效?

我最近对我的User类(memcached)进行了更改;有什么办法可以使所有以User开头的条目无效,而不会使整个缓存失效?

如果没有,有没有解决方法?我宁愿不删除所有内容。

2
Thomas Bonini

memcached FAQ按名称空间删除

虽然memcached不支持通过命名空间删除或删除任何类型的通配符(因为没有命名空间),但有一些技巧可用于模拟它。但它们确实需要额外访问memcached服务器。

PHP中的示例,用于使用名为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");

如果您计划仅清除部分缓存,则可以考虑将到期时间设置为更短的时间段。

3
artlung

由于memcached没有命名空间或类似于通配符的删除/查询,您可以执行以下操作:保存所有键以键中的命名空间“user_”开头。

例如

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

现在,当您要删除以“user_”开头的所有键时,首先获取键“user_”。通过这样做,您可以删除所有要删除的键

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