如何在memcached中删除具有相同前缀键的项目?

nor*_*ree 26 php memcached prefix

例如,我有一些具有相同前缀的缓存项,例如

'app_111111', 'app_222222', 'app_333333', ...
Run Code Online (Sandbox Code Playgroud)

我可以通过任何memcached命令删除这样的'app_xxxxxx'项吗?

zia*_*aab 39

Memcached不提供开箱即用的功能,因此您必须自己构建它.

我解决这个问题的方法是在我的应用程序中为键组定义一个前缀(或命名空间).我在memcached中设置的任何键都有前缀.每当我想从Memcached"删除"东西时,我只需更改前缀.每当我想在Memcached中查找密钥时,我都会添加该前缀.

在您的情况下,您可以首先将前缀设置为,例如MyAppPrefix1,因此您的密钥将存储为MyAppPrefix1::app_333333,MyAppPrefix1::app_444444.

稍后当您要"删除"这些条目时,请将您的应用程序设置为使用MyAppPrefix2.然后,当你试图从被调用的Memcached中获取一个密钥时app_333333,它会查找MyAppPrefix2::app_333333并且第一次找不到它,就好像它已被删除一样.

  • 你如何删除旧条目?到期时间? (2认同)

bil*_*oah 6

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;
}
Run Code Online (Sandbox Code Playgroud)

删除以$ prefix开头的键,并返回所有已删除键的列表。我现在在共享服务器上运行了30,000+个密钥,运行起来非常快-可能不到一秒钟。

  • 这不能保证能正常工作。“ http://php.net/manual/zh-cn/memcached.getallkeys.php”由于Memcache不能保证返回所有密钥,因此您也不能假定已返回所有密钥。 (2认同)
  • 感谢您指出@TimMartens。我想这差不多可以得到吗?我希望有更多关于何时以及为什么`getAllKeys()`方法可能会失败的信息。.您能对此有所了解吗?该文档是非常无益的。 (2认同)