遍历memcache中已缓存的key

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

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

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

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

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

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

 最后得到的解决类似与

 
 
1 $memcache = new Memcache(); 2 3   $all_items = $memcache -> getExtendedStats( ' items ' ); 4 5 var_export ( $all_items );

 

 
 
1 array ( 2 ' 192.168.0.110:11211 ' => 3 array ( 4 ' items ' => 5 array ( 6 1 => 7 array ( 8 ' number ' => ' 1 ' , 9 ' age ' => ' 1851 ' , 10 ) , 11 2 => 12 array ( 13 ' number ' => ' 1 ' , 14 ' age ' => ' 1851 ' , 15 ) , 16 3 => 17 array ( 18 ' number ' => ' 2 ' , 19 ' age ' => ' 1864 ' , 20 ) , 21 7 => 22 array ( 23 ' number ' => ' 1 ' , 24 ' age ' => ' 1851 ' , 25 ) , 26 9 => 27 array ( 28 ' number ' => ' 1 ' , 29 ' age ' => ' 1 ' , 30 ) , 31 12 => 32 array ( 33 ' number ' => ' 2 ' , 34 ' age ' => ' 1851 ' , 35 ) , 36 13 => 37 array ( 38 ' number ' => ' 1 ' , 39 ' age ' => ' 1851 ' , 40 ) , 41 14 => 42 array ( 43 ' number ' => ' 1 ' , 44 ' age ' => ' 1851 ' , 45 ) , 46 15 => 47 array ( 48 ' number ' => ' 1 ' , 49 ' age ' => ' 1851 ' , 50 ) , 51 16 => 52 array ( 53 ' number ' => ' 1 ' , 54 ' age ' => ' 1850 ' , 55 ) , 56 18 => 57 array ( 58 ' number ' => ' 2 ' , 59 ' age ' => ' 1851 ' , 60 ) , 61 19 => 62 array ( 63 ' number ' => ' 1 ' , 64 ' age ' => ' 1851 ' , 65 ) , 66 20 => 67 array ( 68 ' number ' => ' 1 ' , 69 ' age ' => ' 1851 ' , 70 ) , 71 ) , 72 ) , 73 )

$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',);



 
 
1 foreach ( $options as $option ) { 2 if ( isset ( $all_items [ $option ][ ' items ' ])) { 3 $items = $all_items [ $option ][ ' items ' ]; 4 5 foreach ( $items as $number => $item ) { 6 $str = $ memcache -> getExtendedStats( ' cachedump ' , $number , 0 ); 7 $line = $str [ $option ]; 8 if ( is_array ( $line ) && count ( $line ) > 0 ) { 9 foreach ( $line as $key => $value ) { 10 $keys [] = $key ; 11 } 12 } 13 } 14 } 15 }

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

下面贴出来完整的代码



 
 
1 function list_key() { 2 $memcache = new Memcache(); 3 $all_items = $memcache -> getExtendedStats( ' items ' ); 4 $keys = array (); 5 foreach ( $this -> _options as $options ) { 6 foreach ( $options as $option ) { 8    if ( isset ( $all_items [ $option ][ ' items ' ])) { 9 $items = $all_items [ $option ][ ' items ' ]; 10 foreach ( $items as $number => $item ) { 11 $str = $memcache -> getExtendedStats( ' cachedump ' , $number , 0 ); 12 $line = $str [ $option ]; 13    if ( is_array ( $line ) && count ( $line ) > 0 ){
                foreach ( $line as $key => $value ) {
$keys [] = $key ; 14    } 15   } 16 } 17 } 18 } 19 } 20 21 return array_unique ( $keys ); 22 23 }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值