zoukankan      html  css  js  c++  java
  • (转载)遍历memcache中已缓存的key

    (转载)http://www.cnblogs.com/ainiaa/archive/2011/03/11/1981108.html

    最近需要做一个缓存管理的功能。其中有一个需要模糊匹配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 ($optionsas$option) {
    2 if (isset($all_items[$option]['items'])) {
    3 $items=$all_items[$option]['items'];
    4
    5 foreach ($itemsas$number=>$item) {
    6 $str=$memcache->getExtendedStats('cachedump',$number,0);
    7 $line=$str[$option];
    8 if (is_array($line) &&count($line) >0) {
    9 foreach ($lineas$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 ($optionsas$option) {
    8   if (isset($all_items[$option]['items'])) {
    9 $items=$all_items[$option]['items'];
    10 foreach ($itemsas$number=>$item) {
    11 $str=$memcache->getExtendedStats('cachedump',$number,0);
    12 $line=$str[$option];
    13   if (is_array($line) &&count($line) >0){
                    foreach ($lineas$key=>$value) {
    $keys[] =$key;
    14    }
    15   }
    16 }
    17 }
    18 }
    19 }
    20
    21 returnarray_unique($keys);
    22
    23 }
     
     
     

    例子:
    <?php
        $mem = new Memcache;
        $mem->connect("localhost", 11211);
    
        $all_items = $mem->getExtendedStats('items');
        $options = array('localhost:11211');
        
        $keys = array();
        foreach ($options as $option) 
        {
            if (isset($all_items[$option]['items'])) 
            {
                $items = $all_items[$option]['items'];
                 
                foreach ($items as $number=>$item) 
                {
                    $str = $mem->getExtendedStats('cachedump', $number, 0);
                    $line = $str[$option];
                    
                    if (is_array($line) && count($line) > 0) 
                    {
                        foreach ($line as $key => $value) 
                        {
                            $keys[] = $key;
                        }
                    }
                }
            }
        }
       
        var_dump($keys);
    ?>
  • 相关阅读:
    国王游戏
    从2014到2015,还有什么?
    【转载】别把自己推到了墙角
    IE9+浏览器input文本框/密码框后面的小叉子/小眼睛清除
    ajax开发模拟后端数据接口
    谈谈JavaScript事件
    也说border-box盒模型
    极其简单的使用基于gulp和sass前端工作流
    如何使用javascript书写递归函数
    Git基本命令和GitFlow工作流
  • 原文地址:https://www.cnblogs.com/Robotke1/p/3157211.html
Copyright © 2011-2022 走看看