(转载)遍历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信息。
最后得到的解决类似与
$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的更多相关文章
- java MemCachedClient遍历memcache中所有的key
在java memcached client documentation中没有提共遍历memcache所有key的方法.但是提供了两个方法statsItems和statsCacheDump,通过sta ...
- (转)memcache、redis缓存
memcache原理.内存模型: http://www.csdn.net/article/2016-03-16/2826609 redis原理: http://baike.baidu.com/link ...
- 菜鸟-手把手教你把Acegi应用到实际项目中(7)-缓存用户信息
首先讲讲EhCache.在默认情况下,即在用户未提供自身配置文件ehcache.xml或ehcache-failsafe.xml时,EhCache会依据其自身Jar存档包含的ehcache-fails ...
- 获取map中的一个value值以及遍历map获得map里所有key、value的值
前言: 1.声明一个map: Map map = new HashMap();2.向map中放值,注意:map是key-value的形式存放的.如: map.put(”sa”,”dd”); 3.从ma ...
- JS 遍历JSON中每个key值
JS 遍历JSON中的每个key值,可以按键值对进行存储: var myVar = { typeA: { option1: "one", option2: "two&qu ...
- (转载)Java中如何遍历Map对象的4种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- 【转载】C#中遍历DataTable中的数据行
在C#中的Datatable数据变量的操作过程中,有时候我们需要遍历DataTable变量获取每一行的数据值,例如将DataTable变量转换为List集合的时候,我们就会遍历DataTable变量, ...
- NoSQL分类及ehcache memcache redis 三大缓存的对比
NoSQL分类 由于NoSQL中没有像传统数据库那样定义数据的组织方式为关系型的,所以只要内部的数据组织采用了非关系型的方式,就可以称之为NoSQL数据库.目前,可以将众多的NoSQL数据库按照内部的 ...
- redis 在 php 中的应用(key篇)
本文为我阅读了 redis参考手册 之后结合 博友的博客 编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) 目录: KEY(键) DEL ...
随机推荐
- JavaScript 数据类型转换(显式与隐式)
一.数据类型 JS中有5中简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String.还有一种复杂数据类型------Object,Object本质是 ...
- android Services注意地方
使用service前需要在manifest声明: <manifest ... > ... <application ... > <service android:name ...
- jdbc - Insert 'Date' value in PreparedStatement
“preparedStatement.setDate()”方法接受的是 'java.sql.Date' 类型的参数,而我们一般格式化日期所使用的是'java.util.Date'中的'SimpleDa ...
- sp_addlinkedserver的一些操作
sp_addlinkedserver 创建一个链接的服务器,使其允许对分布式的.针对 OLE DB 数据源的异类查询进行访问.在使用 sp_addlinkedserver 创建链接的服务器之后,此服务 ...
- jq 图片裁剪
1.html <div class="jcropbox" style="display: none"> <img src="&quo ...
- 《du命令》-linux命令五分钟系列之三
本原创文章属于<Linux大棚>博客. 博客地址为http://roclinux.cn. 文章作者为roc 希望您能通过捐款的方式支持Linux大棚博客的运行和发展.请见“关于捐款” == ...
- Java学习----对象间的继承
继承:子类可以使用父类非私有的成员变量和方法 public class Father { public String name; public String bloodType; private in ...
- tbody 滚动条
ARRIVALS TO BRISTOL - ENGLAND FLIGHT CODE FROM STA ETA Notes T3 4264 ISLE OF MAN 11:40 11:42 LANDED ...
- Easyui的combobox组件无法选择内容
我切换combobox的内容的时候,老是选中的是第一行的数据,因为我渲染的时候没有给它valueField和textField的字段,而默认的又不是我要求的. 加上就好了. $("#tool ...
- 最大乘积(Maximum Product,UVA 11059)
Problem D - Maximum Product Time Limit: 1 second Given a sequence of integers S = {S1, S2, ..., Sn}, ...