当前位置:  开发笔记 > 编程语言 > 正文

内存缓存和通配符

如何解决《内存缓存和通配符》经验,为你挑选了2个好方法。

我只是想知道是否有办法使用通配符清除memcache的键值.

所以说我有一个带有"1234~foo"键和另一个"1234~foo~bar"的缓存.

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

我希望这是有道理的.

谢谢.



1> Eric Petroel..:

不,没有直接简单的方法来做到这一点.在常见问题解决了这一点,并提供了一种变通方法:

按名称空间删除

虽然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");


他们并没有忽视它 - 相反,数据结构并不是为了处理它而构建的.Memcache最重要的是原始速度,并且没有indexin或order.你必须列举一切.因此,你可以自己解决这个问题.
Memcache通常针对O(1)操作.通过通配符删除不是O(1),并且可能会在相对较长的时间段内锁定服务器.请参阅http://code.google.com/p/memcached/wiki/NewOverview
这个解决方案非常酷.但是为什么memcached计划者会忽略这样一个(看似)整合的功能,如通过通配符删除?我猜是某种表现原因.有人知道吗?

2> 小智..:

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

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

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

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

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有