博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用php Memcache模块如何正确遍历所有KEY以及VALUE
阅读量:7120 次
发布时间:2019-06-28

本文共 2752 字,大约阅读时间需要 9 分钟。

hot3.png

   在php提供的用于与memcached交互的扩展模块中有memcached与memcache,前者提供方法getAllKeys用于遍历所有Memcached服务器上的key,但是并不保证原子操作,而后者却没有提供任何方法,虽然在PHP官方

文档中有人给出使用方法getExtendedStats来间接获取Memcached服务器上的所有key,但是给出的代码是有不少坑的,如果拿来就用,对于cluster的memcached服务器而言,有些问题就需要指出来。

       下面将给出官方文档中的代码,并指出可能面临的问题,代码如下:

connect('127.0.0.1', 11211) or die ("Could not connect to memcache server");$list = array();$allSlabs = $memcache->getExtendedStats('slabs');$items = $memcache->getExtendedStats('items');foreach($allSlabs as $server => $slabs) { foreach($slabs AS $slabId => $slabMeta) { $cdump = $memcache->getExtendedStats('cachedump',(int)$slabId); foreach($cdump AS $keys => $arrVal) { foreach($arrVal AS $k => $v){ echo $k ."
"; } } }}//EO getMemcacheKeys() ?>

       在上述代码中,如果用于获取单个memcached服务器上的key,是不存在任何问题,但是获取连接池中的多个memcached所有key就存在问题,会发现打印出重复的key,问题就在于当使用getExtendedStats用去特定$slabID

上的信息时,返回的是连接池中所有的服务器上的特定$slabId 的存储的keys信息。当$server为"127.0.0.1:11214"且$slabId为0将变量$cdump的信息打印出如下所示:

array(2) {  ["127.0.0.1:11214"]=>  array(1) {    ["course_schools__??¨é?¨"]=>    array(2) {      [0]=>      string(1) "0" [1]=>      string(10) "1380635175" }  }  ["127.0.0.1:11216"]=>  array(1) {    ["monitorMemcache"]=>    array(2) {      [0]=>      string(2) "10" [1]=>      string(10) "1385635702" }  }}

当$server为"127.0.0.1:11216"且$slabId为0将变量$cdump的信息打印出如下所示:

array(2) {  ["127.0.0.1:11214"]=>  array(1) {    ["course_schools__??¨é?¨"]=>    array(2) {      [0]=>      string(1) "0" [1]=>      string(10) "1380635175" }  }  ["127.0.0.1:11216"]=>  array(1) {    ["monitorMemcache"]=>    array(2) {      [0]=>      string(2) "10" [1]=>      string(10) "1385635702" }  }}

也就是说,按照上述代码循环,会遭遇遍历不同memcached服务器时,对于某个$slabId,就有可能再次获取其他服务器此$slabId的信息(其他服务器也含有$slabId的值),因而在memcached是连接池的情景,会出现key重复的情况,使用上述代码,

为正确获取且不重复遍历连接池所有服务器的某特定$slabID信息,可以先统计出连接池所有memcached服务器中的不重复$slabId,再获取某$slabId信息,从而遍历出不重复的所有key以及value内容,关键代码片段如下:

39         $allSlabs = $memcache->getExtendedStats('slabs');         40         foreach($allSlabs as $server => $slabs) 41         { 42             foreach($slabs as $slabId => $slabInfo) 43             { 44 if(isset($allSlabIds[$slabId])) 45                 { 46 continue; 47                 } 48 49                 $allSlabIds[$slabId] = 1; 50             } 51         } 52 53 //再打印出key  
54         foreach($allSlabIds as $slabId => $counter) 55         { 56             $cdump = $memObj->getExtendedStats('cachedump',(int)$slabId); 57             foreach($cdump AS $keys => $arrVal)- 58             { 59 if (!is_array($arrVal)) continue; 60                 foreach($arrVal AS $k => $v)- 61                 { 62                     echo $k ."
"; 63 } 64 } 65 }

转载于:https://my.oschina.net/u/586648/blog/190825

你可能感兴趣的文章