memcached的伪命名空间的一种实现方式

问题:

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的版本。

//原来缓存的数据会因为超时,被重复利用。并没有违背主动删除数据。

 

 

 

你可能感兴趣的:(memcached,伪命名空间,memcached,namespace)