我只是想知道是否有办法使用通配符清除密钥值的内存缓存。
所以说我有一个带有“1234~foo”键和另一个“1234~foo~bar”的缓存。
我有什么方法可以通过使用clear(“1234 *”)之类的东西来清除缓存并从上面清除它们吗?
我希望这是有道理的。
感谢。
答案 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条目,并在其中存储相关键的数组。在删除例程中,读取并迭代这些键以进行删除。