zoukankan      html  css  js  c++  java
  • 遍历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 }

    

  • 相关阅读:
    记事本:js简介
    python 类的魔法函数 内置函数 类方法 静态方法 抽象类
    python 类
    python 列表 元组 字典 集合
    python:函数和循环判断
    记事本:盒模型
    第5章学习小结
    倍增法求LCA(最近公共最先)
    L
    第4章学习小结
  • 原文地址:https://www.cnblogs.com/ainiaa/p/1981108.html
Copyright © 2011-2022 走看看