问题:
1.memcached的规则并不建议,甚至反对开发人员主动的删除数据 .{不考虑flush_all...}
但是就是存在一些场景,需要手动的删除一组数据,而这么一组数据拥有一定的规则{即命名空间}
2.memcached 当中并没有明确的命名空间的概念及实现{恩,这一点值得肯定},问题就是这样,怎么删除这组数据呢.
方式:
google上流传出来的一种伪命名空间的方式,即可以不违反"不主动删除数据"的规则,还能够使原来的那一组数据失效,等价于删除.
方式解读:
memcache存取数据都是通过key来完成的。按照一定的方式拼装 key,即可模拟命名空间。
一种key的拼装规则:
key = namespace_name + namespace_key + value_key ;
namespace_name:命名空间的 String
namespace_key:命名空间的Key,我觉得叫做 namespace_version更好。每次想删除一组数据时提升版本。
value_key:待缓存数据的 Key,命名空间内数据的 id;
程序如下:{快速阅读,下边有程序的解读}
$ns_key = $memcache->get("foo_namespace_key");
// if not set, initialize it
if($ns_key===false)
$memcache->set("foo_namespace_key", rand(1, 10000));
// 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");
程序解读:
// 设定的命名空间名称为 foo
$ns_key = $memcache->get("foo_namespace_key"); //得到现在的 namespace 的 版本号。
// if not set, initialize it {没有的话,生成一个版本号}
if($ns_key===false) $memcache->set("foo_namespace_key", rand(1, 10000));
// cleverly use the ns_key {利用这个namespace_key}
$my_key = "foo_".$ns_key."_12345";//{12345为 value_key , 看看这个 my_key是怎么拼装的。}
//foo为 namespace ,ns_key 为 取出的 namespace_key,123456 为 value_key
$my_val = $memcache->get($my_key); //根据生成的 key 取数据
//To clear the namespace do: {想要删除 命名空间 为 foo 的数据时,这样做:}
$memcache->increment("foo_namespace_key");//修改namespace_key的值。即提升namespace的版本。
//原来缓存的数据会因为超时,被重复利用。并没有违背主动删除数据。