(转载)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信息。

最后得到的解决类似与

 $memcache=new Memcache();

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

 var_export($all_items);

 array (
'192.168.0.110:11211'=>
array (
'items'=>
array (
=>
array (
'number'=>'',
'age'=>'',
),
=>
array (
'number'=>'',
'age'=>'',
),
=>
array (
'number'=>'',
'age'=>'',
),
=>
array (
'number'=>'',
'age'=>'',
),
=>
array (
'number'=>'',
'age'=>'',
),
=>
array (
'number'=>'',
'age'=>'',
),
=>
array (
'number'=>'',
'age'=>'',
),
=>
array (
'number'=>'',
'age'=>'',
),
=>
array (
'number'=>'',
'age'=>'',
),
=>
array (
'number'=>'',
'age'=>'',
),
=>
array (
'number'=>'',
'age'=>'',
),
=>
array (
'number'=>'',
'age'=>'',
),
=>
array (
'number'=>'',
'age'=>'',
),
),
),
)

$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 ($optionsas$option) {
if (isset($all_items[$option]['items'])) {
$items=$all_items[$option]['items']; foreach ($itemsas$number=>$item) {
$str=$memcache->getExtendedStats('cachedump',$number,);
$line=$str[$option];
if (is_array($line) &&count($line) >) {
foreach ($lineas$key=>$value) {
$keys[] =$key;
}
}
}
}
}

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

下面贴出来完整的代码


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

例子:
<?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);
?>

(转载)遍历memcache中已缓存的key的更多相关文章

  1. java MemCachedClient遍历memcache中所有的key

    在java memcached client documentation中没有提共遍历memcache所有key的方法.但是提供了两个方法statsItems和statsCacheDump,通过sta ...

  2. (转)memcache、redis缓存

    memcache原理.内存模型: http://www.csdn.net/article/2016-03-16/2826609 redis原理: http://baike.baidu.com/link ...

  3. 菜鸟-手把手教你把Acegi应用到实际项目中(7)-缓存用户信息

    首先讲讲EhCache.在默认情况下,即在用户未提供自身配置文件ehcache.xml或ehcache-failsafe.xml时,EhCache会依据其自身Jar存档包含的ehcache-fails ...

  4. 获取map中的一个value值以及遍历map获得map里所有key、value的值

    前言: 1.声明一个map: Map map = new HashMap();2.向map中放值,注意:map是key-value的形式存放的.如: map.put(”sa”,”dd”); 3.从ma ...

  5. JS 遍历JSON中每个key值

    JS 遍历JSON中的每个key值,可以按键值对进行存储: var myVar = { typeA: { option1: "one", option2: "two&qu ...

  6. (转载)Java中如何遍历Map对象的4种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  7. 【转载】C#中遍历DataTable中的数据行

    在C#中的Datatable数据变量的操作过程中,有时候我们需要遍历DataTable变量获取每一行的数据值,例如将DataTable变量转换为List集合的时候,我们就会遍历DataTable变量, ...

  8. NoSQL分类及ehcache memcache redis 三大缓存的对比

    NoSQL分类 由于NoSQL中没有像传统数据库那样定义数据的组织方式为关系型的,所以只要内部的数据组织采用了非关系型的方式,就可以称之为NoSQL数据库.目前,可以将众多的NoSQL数据库按照内部的 ...

  9. redis 在 php 中的应用(key篇)

    本文为我阅读了 redis参考手册 之后结合 博友的博客 编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) 目录: KEY(键) DEL           ...

随机推荐

  1. Android(java)学习笔记203:网页源码查看器(Handler消息机制)

    1.项目框架图: 2.首先是布局文件activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com ...

  2. css 权威指南笔记(四)选择器

    规则结构 每个规则都有两个基本部分组成:选择器和声明块.声明块由一个或多个声明组成,每个声明则是一个属性-值对. 元素选择器 声明和关键字 关键字一般由空格隔开:有一种情况例外 font属性中的  斜 ...

  3. RHEL7重置root密码

    一.rd.break方法 在linux16那一段的最后,空一格输入rd.break 按Ctrl+启动到单用户模式,如下: 进去后输入命令mount,发现根为/sysroot/,并且不能写,只有ro=r ...

  4. 9.20 noip模拟试题

      Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一届的学弟学妹,邪恶的chenzeyu97发现一位学弟与他同名,于是他当起了善良的学长233 “来来来,学弟,我 ...

  5. OSI 网络七层模型(笔记)

    一直以来我们都在使用着互联网,每天聊着qq,上着淘宝,但是却不了解怎么运行的呢,充满了好奇.今天同过了解来总结一下OSI网络七层模型: 上一张图 OSI (open system interconne ...

  6. Android 官方新手指导教程

    一.开始 1.建立第一个应用程序 依赖关系和先决条件 Android SDK ADT Plugin 20.0.0 或更高 (如果你使用eclipse的话) 欢迎来到Android应用程序开发! 这一节 ...

  7. Java环境的安装与配置

    Java环境的安装与配置 环境:Java8,win10 推荐oracle官网oracle官网https://www.oracle.com/index.html下载JDK进行安装 选择自己需要的版本下载 ...

  8. java 从jar包中读取资源文件

    在代码中读取一些资源文件(比如图片,音乐,文本等等),在集成环境(Eclipse)中运行的时候没有问题.但当打包成一个可执行的jar包(将资源文件一并打包)以后,这些资源文件找不到,如下代码: Jav ...

  9. wordpress 当前栏目名,当前栏目的分类名

    wordpress在设计主题和做模板时经常会用到调用当前分类栏目名称,常见的有当前栏目页.文章页,详情代码如下: 1.分类名称与链接 <?php the_category(); ?> 2. ...

  10. What's the use of @ before the path defination

    When you define your path const : const string Child_Medical_Pdf = @"~/Media/ChildPdf"; Th ...