Memcached本身对外提供的命令不多,也就add、get、set、incr、decr、replace、delete、stats等几个,客户端对这些操作进行了封装,总体来说调用还是很简单的。 初看了下EnyimMemcached结构,所有的操作都从Operation类继承,每个子类都实现自己的ExcuteAction

 
      操作:新窗口查看图片  
 
 
 

所有的操作都由MemCachedClient这个门面提供

 
      操作:新窗口查看图片  
 
 
 

在使用过程中,我需要遍历当前缓存,获取所有键值,EnyimMemCached却没有提供遍历的方法。在网上查了下,http://www.cnblogs.com/sunli/archive/2008/11/01/1324153.html 提供了遍历的思路,很简单,用"stats item"与"stats cachedump 1 0"命令即可实现遍历,我要做的只是把两个命令封装成上面提到的Operation,下面是实现代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions; namespace Enyim.Caching.Memcached
{
/// <summary>
/// 扩展的获取所有键值操作 by wm
/// </summary>
internal class CacheDumpOperation : Operation
{
public CacheDumpOperation(ServerPool pool, string regex) : base(pool)
{
this.regexquery = regex;
} private ArrayList results;
/// <summary>
/// 结果键值集合
/// </summary>
public ArrayList Results
{
get { return results; }
} private string regexquery = "";
/// <summary>
/// 查询条件正则表达式
/// </summary>
public string RegexQuery
{
get { return regexquery; }
set { regexquery = value; }
} protected override bool ExecuteAction()
{
List<string> lstParams = new List<string>();
ArrayList arrKeys = new ArrayList(); foreach (MemcachedNode server in this.ServerPool.WorkingServers)
{
using (PooledSocket ps = server.Acquire()) //step1
{
if (ps != null)
{
ps.SendCommand("stats items");
while (true)
{
string line = ps.ReadResponse(); if (String.Compare(line, "END", StringComparison.Ordinal) == )
break; if (line.Length < || String.Compare(line, , "STAT ", , , StringComparison.Ordinal) != )
{
continue;
} string para = line.Split(':')[];
if (!lstParams.Contains(para))
{
lstParams.Add(para);
}
}
} } using (PooledSocket psDump = server.Acquire()) //step2
{
if (psDump != null)
{
foreach (string para in lstParams)
{
psDump.SendCommand(string.Format("stats cachedump {0} {1}", para, ));
while (true)
{
string lineDump = psDump.ReadResponse();
if (String.Compare(lineDump, "END", StringComparison.Ordinal) == )
break; if (lineDump.Length < || String.Compare(lineDump, , "ITEM ", , , StringComparison.Ordinal) != )
{
continue;
} string key = lineDump.Split(' ')[];
if (this.regexquery == "")
{
arrKeys.Add(key);
}
else
{
if (Regex.IsMatch(key, this.regexquery))
{
arrKeys.Add(key);
}
}
}
}
}
} } this.results = arrKeys; return true; }
}
}
</string></string>

在MemcachedClient中添加方法

/// <summary>
/// 获取所有键值集合
/// </summary>
/// <returns></returns>
public System.Collections.ArrayList GetKeys()
{
using (CacheDumpOperation g = new CacheDumpOperation(this.pool, ""))
{
g.Execute();
return g.Results;
}
} /// <summary>
/// 根据正则查找匹配缓存键值集合
/// </summary>
/// <param name="regex">
/// <returns></returns>
public System.Collections.ArrayList GetKeys(string regex)
{
using (CacheDumpOperation g = new CacheDumpOperation(this.pool, regex))
{
g.Execute();
return g.Results;
}
}

EnyimMemcached扩展 遍历功能的更多相关文章

  1. BrnShop开源网上商城第六讲:扩展视图功能

    在正式讲解扩展视图功能以前,我们有必要把视图的工作原理简单说明下.任何一个视图都会被翻译成一个c#类,并保存到指定的位置,然后被编译.这也就是为什么能在视图中包含c#代码片段的原因.下面我们通过一个项 ...

  2. 关于ligerui 中 grid 表格的扩展搜索功能在远程数据加载时无法使用的解决办法

    要想使用grid里的扩展搜索功能,除了要引用ligerui主要的js文件外,还必须引入下面的JS文件: 1.Source\demos\filter\ligerGrid.showFilter.js 2. ...

  3. Java基础知识强化之集合框架笔记17:List集合的特有的遍历功能

    1. List集合的特有遍历功能: size()和 get()方法结合使用 2. 代码示例: package cn.itcast_03; import java.util.ArrayList; imp ...

  4. php扩展Redis功能

    php扩展Redis功能 1 首先,查看所用php编译版本V6/V9 在phpinfo()中查看 2 下载扩展 地址:https://github.com/nicolasff/phpredis/dow ...

  5. DEVOPS技术实践_17:Jenkins使用扩展邮件功能发送邮件

    一 环境准备 1.1 安装插件Email Extension 系统管理-管理插件-安装Email Extension插件 1.2 配置 配置jenkins邮箱的全局配置:系统管理-系统设置-完成邮箱配 ...

  6. 利用Mixins扩展类功能

    8.18 利用Mixins扩展类功能 - python3-cookbook 3.0.0 文档 https://python3-cookbook.readthedocs.io/zh_CN/latest/ ...

  7. 适用于 Windows 的虚拟机扩展和功能

    Azure 虚拟机扩展是小型应用程序,可在Azure 虚拟机上提供部署后配置和自动化任务. 例如,如果虚拟机要求安装软件.防病毒保护或进行 Docker 配置,便可以使用 VM 扩展来完成这些任务. ...

  8. 基于web的网上书城系统开发-----登录注册扩展-------验证码功能

    public class CheckCode extends HttpServlet { private static final long serialVersionUID = 1L; privat ...

  9. 新增扩展程序功能打包提交新版 WARNING ITMS-90473 警告问题

    1.问题描述 自从在主应用中加入SiriShortCut功能之后,打包程序上传至 iTunes Connect 就会出现警告,看其原因描述是CFBundleVersion主应用与子应用的不一致导致的 ...

随机推荐

  1. 求解答,Android源码编译时怎样添加第三方jar包

    各位大神好,遇到的问题如标题. 我用Eclipse写了一个android工程,但是这个工程需要到SDK的隐藏类,所有想在源码下编译,但是每次mm之后,都会出现错误,提示是找不到对应的类. 我需要加入的 ...

  2. 把Storyboard减轻的方法

    把Storyboard减轻的方法 by 伍雪颖 UIViewController *secondStoryboard = [[UIStoryboard storyboardWithName:@&quo ...

  3. oracle Can't connect to X11 window server using ':0.0' /Checking monitor: must be configured to display at least 256 colors解决方法

    Can't connect to X11 window server using ':0.0' 解决方法 1. 以oracle 用户登陆X window 或者 2. root 身份执行 # xhost ...

  4. 创建GIF loading图片

    第一步 新建一个宽80PX 高10PX的文档 第二步 做8个宽8PX的方格 黄色色值#e7a521 红色色值#ff0000(可根据自己的喜好设定) 第三步 复制7个层(共8个图层)每个图层相应改变红色 ...

  5. CodeSmith 模版

    <%@ CodeTemplate Language="C#" TargetLanguage="C#" Src="" Inherits= ...

  6. Java开发23中设计模式

    设计模式(Design Patterns) 设计模式是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结.使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码的可靠性.毫无疑问 ...

  7. MySql5压缩包安装

    一. 解压所有文件到一个目录:例如D:\Program Files\mysql-5.6.22-winx64 二. 配置系统的环境变量:在Path路径后追加:;D:\Program Files\mysq ...

  8. kettle新建资源库出错

    之前在本地测试新建kettle资源库很顺利,但是在把本地数据迁移到服务器的过程中出现了问题,多次新建资源库失败,提示插入数据错误. 解决办法: 将要执行的sql语句复制出来,单独在Navicat下执行 ...

  9. JAVA异常使用_每个人都曾用过、但未必都用得好

    一.抛出异常 vs. 返回错误代码 有人说“Well, an exception is a goto.”,但也有人言“makes the code simpler by visibly separat ...

  10. jquery判断客户端的类型

    针对不同客户端下载链接的页面响应样式不一样,更人性点而已 //匹配客户端类型 var isAndroid = navigator.userAgent.toLowerCase().match(/andr ...