使用php Memcache模块如何正确遍历全部KEY以及VALUE

   在php提供的用于与memcached交互的扩展模块中有memcached与memcache,前者提供方法getAllKeys用于遍历全部Memcached服务器上的key,可是并不保证原子操做,然后者却没有提供任何方法,虽然在PHP官方
文档中有人给出使用方法getExtendedStats来间接获取Memcached服务器上的全部key,可是给出的代码是有很多坑的,若是拿来就用,对于cluster的memcached服务器而言,有些问题就须要指出来。 php

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

<?php
/*\*
* Function to get all memcache keys
* @author Manish Patel
* @Created:  28-May-2010
\*/
function getMemcacheKeys() {

$memcache = new Memcache;
$memcache->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 ."<br>";
         }
      }
    }
}//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的信息打印出以下所示: memcached

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内容,关键代码片断以下: spa

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 ."<br>";
 63                }
 64             }
 65         }
相关文章
相关标签/搜索