今天是: 收藏本站 设为主页
网站首页 >  技术专栏  >  php  > 

遍历memcache中已缓存的key

日期:2015-09-30  点击率:527


最近需要做一个缓存管理的功能。其中有一个需要模糊匹配memcached的key然后进行删除匹配上的key对应的数据。

难点在于memcache 没有提供模糊匹配key删除缓存的功能,也没有提供遍历memcache key的功能。在网上search了下,

点击10个连接有9个都是一篇文章的copy。网上最流行的方法发现key不能正确的获得。baidu google 全用上了就是没有解决。。。

最后还是抱着试试的心态,终于把问题给解决了。废话少说。说说,我实现的代码:

遍历memcache的可以需要有一下几个步骤:

1、通过使用memcache 内置方法Memcache::getExtendedStats,首先获得items信息。

最后得到的解决类似与

$memcache = new Memcache();

$all_items = $memcache->getExtendedStats('items');

var_export($all_items);


array (
'192.168.0.110:11211' =>
array (
'items' =>
array (
1 =>
array (
'number' => '1',
'age' => '1851',
),
2 =>
array (
'number' => '1',
'age' => '1851',
),
3 =>
array (
'number' => '2',
'age' => '1864',
),
7 =>
array (
'number' => '1',
'age' => '1851',
),
9 =>
array (
'number' => '1',
'age' => '1',
),
12 =>
array (
'number' => '2',
'age' => '1851',
),
13 =>
array (
'number' => '1',
'age' => '1851',
),
14 =>
array (
'number' => '1',
'age' => '1851',
),
15 =>
array (
'number' => '1',
'age' => '1851',
),
16 =>
array (
'number' => '1',
'age' => '1850',
),
18 =>
array (
'number' => '2',
'age' => '1851',
),
19 =>
array (
'number' => '1',
'age' => '1851',
),
20 =>
array (
'number' => '1',
'age' => '1851',
),
),
),
)

$all_items中的key“192.168.0.110:11211” 就是memcache的host和port。

2、已$all_items做为数据源,再次调用Memcache::getExtendedStats,我们需要的数据就在返回的结果里面

我们假设memcache所有的host信息为$options = array('192.168.0.110:11211',);

foreach ($options as $option) {
if (isset($all_items[$option]['items'])) {
$items = $all_items[$option]['items'];

foreach ($items as $number => $item) {
$str = $memcache->getExtendedStats('cachedump', $number, 0);
$line = $str[$option];
if (is_array($line) && count($line) > 0) {
foreach ($line as $key => $value) {
$keys[] = $key;
}
}
}
}
}

上面的$keys数组就是我们需要的数据了。

下面贴出来完整的代码

function list_key() {
$memcache = new Memcache();
$all_items = $memcache->getExtendedStats('items');
$keys = array();
foreach ($this->_options as $options) {
foreach ($options as $option) {
  if (isset($all_items[$option]['items'])) {
$items = $all_items[$option]['items'];
foreach ($items as $number => $item) {
$str = $memcache->getExtendedStats('cachedump', $number, 0);
$line = $str[$option];
  if (is_array($line) && count($line) > 0){                foreach ($line as $key => $value) { $keys[] = $key;
   }
  }
}
}
}
}

return array_unique($keys);

}




下一篇:ssh 免密码登录   上一篇:内存提取SWF,破解doswf方法概述