内存缓存和通配符

时间:2009-10-20 16:41:45

标签: memcached

我只是想知道是否有办法使用通配符清除密钥值的内存缓存。

所以说我有一个带有“1234~foo”键和另一个“1234~foo~bar”的缓存。

我有什么方法可以通过使用clear(“1234 *”)之类的东西来清除缓存并从上面清除它们吗?

我希望这是有道理的。

感谢。

4 个答案:

答案 0 :(得分:49)

不,没有一种直接简单的方法可以做到这一点。 FAQ解决了这个问题,并提供了一种解决方法:

按名称空间删除

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

示例,在PHP中,使用名为foo的命名空间:

$ns_key = $memcache->get("foo_namespace_key");
// if not set, initialize it
if($ns_key===false) {
    $ns_key=rand(1, 10000);
    $memcache->set("foo_namespace_key", $ns_key);
}
// 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");

答案 1 :(得分:6)

Eric Petroelje关于名称空间解决方案的说明:

请记住,您不知道memcached何时会驱逐您的命名空间密钥。 Memcache可能会驱逐你的命名空间密钥,然后在尝试设置一个新密钥时,它的概率为1到10000,它将选择相同的索引密钥 - 这意味着你将获得“脏”结果。这不太可能,但最重要的是,它不安全。

同样的问题是Poul Vernon的解决方案。

安全的解决方案是使用可靠的存储(例如磁盘)作为“指针键”/“命名空间键”。

答案 2 :(得分:2)

php中这个函数怎么样:

function deleteKeysByIndex($search) {
    $m = new Memcached();
    $m->addServer('localhost', 11211);
    $keys = $m->getAllKeys();
    foreach ($keys as $index => $key) {
        if (strpos($key,$search) !== false) {
            $m->delete($key);
        } else {
            unset($keys[$index]);
        }
    }

    // returns an array of keys which were deleted
    return $keys;
}

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

答案 3 :(得分:0)

为“1234”创建一个memcache条目,并在其中存储相关键的数组。在删除例程中,读取并迭代这些键以进行删除。