如何在memcached中删除具有相同前缀键的项目?
例如,我有一些具有相同前缀的缓存项目,例如
'app_111111', 'app_222222', 'app_333333', ...
我可以通过任何 memcached 命令删除此类“app_xxxxxx”项目吗?
例如,我有一些具有相同前缀的缓存项目,例如
'app_111111', 'app_222222', 'app_333333', ...
我可以通过任何 memcached 命令删除此类“app_xxxxxx”项目吗?
Memcached不提供开箱即用的此功能,因此您必须自己构建它。
我解决这个问题的方法是在我的应用程序中为键组定义一个前缀(或命名空间)。我在 memcached 中设置的任何键前面都有该前缀。每当我想从Memcached“删除”东西时,我只需更改前缀即可。每当我想在Memcached中查找密钥时,我都会添加该前缀。
在您的情况下,您可以先将前缀设置为 ,例如 ,这样您的密钥将存储为 , 。MyAppPrefix1
MyAppPrefix1::app_333333
MyAppPrefix1::app_444444
稍后,当您要“删除”这些条目时,请将应用程序设置为使用 。然后,当您尝试从Memcached获取名为 的密钥时,它将查找并且第一次找不到它,就好像它已被删除一样。MyAppPrefix2
app_333333
MyAppPrefix2::app_333333
php中的这个函数怎么样:
function deletekeysbyindex($prefix) {
$m = new Memcached();
$m->addServer('localhost', 11211);
$keys = $m->getAllKeys();
foreach ($keys as $index => $key) {
if (strpos($key,$prefix) !== 0) {
unset($keys[$index]);
} else {
$m->delete($key);
}
}
return $keys;
}
删除以$prefix开头的键,并返回已删除的所有键的列表。我刚刚在共享服务器上对30,000多个密钥运行了这个,它非常快 - 可能不到一秒钟。