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

$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.  
  2. foreach ($optionsas$option) {
  3. if (isset($all_items[$option]['items'])) {
  4. $items=$all_items[$option]['items'];
  5.  
  6. foreach ($itemsas$number=>$item) {
  7. $str=$memcache->getExtendedStats('cachedump',$number,);
  8. $line=$str[$option];
  9. if (is_array($line) &&count($line) >) {
  10. foreach ($lineas$key=>$value) {
  11. $keys[] =$key;
  12. }
  13. }
  14. }
  15. }
  16. }

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

下面贴出来完整的代码

  1.  
  2. function list_key() {
  3. $memcache=new Memcache();
  4. $all_items=$memcache->getExtendedStats('items');
  5. $keys=array();
  6. foreach ($this->_options as$options) {
  7. 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,);
  12. $line=$str[$option];
  13.   if (is_array($line) &&count($line) >){
  14.                 foreach ($lineas$key=>$value) {
  15. $keys[] =$key;
  16.    }
  17.   }
  18. }
  19. }
  20. }
  21. }
  22.  
  23. returnarray_unique($keys);
  24.  
  25. }
 
 
 

例子:
  1. <?php
  2. $mem = new Memcache;
  3. $mem->connect("localhost", 11211);
  4.  
  5. $all_items = $mem->getExtendedStats('items');
  6. $options = array('localhost:11211');
  7.  
  8. $keys = array();
  9. foreach ($options as $option)
  10. {
  11. if (isset($all_items[$option]['items']))
  12. {
  13. $items = $all_items[$option]['items'];
  14.  
  15. foreach ($items as $number=>$item)
  16. {
  17. $str = $mem->getExtendedStats('cachedump', $number, 0);
  18. $line = $str[$option];
  19.  
  20. if (is_array($line) && count($line) > 0)
  21. {
  22. foreach ($line as $key => $value)
  23. {
  24. $keys[] = $key;
  25. }
  26. }
  27. }
  28. }
  29. }
  30.  
  31. var_dump($keys);
  32. ?>

(转载)遍历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. js时间字符串转Date对象

    var DATE_REGEXP = new RegExp("(\\d{4})-(\\d{2})-(\\d{2})([T\\s](\\d{2}):(\\d{2}):(\\d{2})(\\.(\ ...

  2. My-sql #1045 - Access denied for user 'root'@'localhost' (using password: NO)

    当你重装数据库后出现这个问题的时候,不要着急,首先你要去你的确定你的数据库已经成功的把服务开启了, 然后确定你的密码和账户,IP都确认的情况下, 去寻找config.inc.php 这个文件,根据配置 ...

  3. CentOS安装memcached及配置php的memcache扩展

    遇到的问题: 这个问题主要是linux服务器安装memcached服务后,phpinfo信息没有memcache扩展,所以主要是给php安装memcache扩展,教程中是安装memcache扩展,我认 ...

  4. Java方法-数组

    [Java数组] 1. 用sort()方法对Java数组进行排序,及如何使用 binarySearch() 方法来查找数组中的元素 binarySearch() 返回值: 如果它包含在数组中,则返回搜 ...

  5. 关于 Repository和UnitOfWork 模式的关系

    本以为,关于这方面的理解,园子中的文章已经很多的了,再多做文章真的就“多做文章了”,但是最近发现,还是有必要的,首先,每个人对于同一事物的理解方式和出发点都是不同的,所以思考的方式得到结果也是不同的. ...

  6. 某PHP代码加密

    <?php /* 本程序已加密: 2014-11-15 10:10:11 */ xs_run('JGxosS9QplmqLA6qjYo/LiX5ecUe0DH7p42Ww/Mdkf5/ybZDs ...

  7. 分享最近写的一个存储过程 SOLVE_LOCK

    CREATE OR REPLACE PROCEDURE SOLVE_LOCK AS V_SQL VARCHAR2(3000); --定义 v_sql 接受抓取锁的sql语句V_SQL02 VARCHA ...

  8. 自构BeanHandler(用BeansUtils)

    class BeanHandler<T> implements ResultSetHandler<T>{ private Class<T> clazz; publi ...

  9. ExtJs中动态加载机制研究(转)

    觉得写的太好了,怕弄丢了,转一下:http://extjs.org.cn/node/659 昨天我们team对于extjs的动态加载机制做了些深入研究,这里先share下controller加载的结果 ...

  10. jQuery api 学习笔记(1)

      之前自己的jquery知识库一直停留在1.4的版本,而目前jquery的版本已经更新到了1.10.2了,前天看到1.10中css()竟然扩充了那么多用法,这2天就迫不及待的更新一下自己的jquer ...