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. 为什么Myeclipse 提示Project 'bankmanager' is missing required library,myeclipse项目上红叉 但内部红叉

    应该是正在使用的项目是从网上下的或者别人那里直接拷贝导致的,解决办法: 下一个mysql-connector-java-5.1.22-bin.jar或者是最新版,最好放项目目录里 右键点项目,Buil ...

  2. Struts2(二)——配置文件struts2.xml的编写

    接上一篇博客,这篇博客讲述一下2——9小标题的内容,这些问题都可以在struts2配置文件中设置(当然有的也可以在Struts.properties属性文件,web.xml中进行设置),而且常规开发中 ...

  3. HINTERNET 句柄

    这篇文章的内容能够简单总结例如以下: WinINet函数创建和使用类型为HINTERNET的句柄 HINTERNET句柄不能与其它类型的句柄互换使用 用InternetCloseHandle关闭HIN ...

  4. 命令行分析java线程CPU占用

    1.使用top命令找出占用cpu最高的JAVA进程pid号 2. 找出占用cpu最高的线程: top -Hp  -n 1 3. 打印占CPU最高JAVA进程pid的堆栈信息 jstack pid &g ...

  5. 左右HttpClient上传的方法来解决中国的乱码

    二手HttpClient人们都知道通过addTextBody方法来加入要上传的文本信息,可是,假设要上传中文的话.或还有中文名称的文件会出现乱码的问题,解决的方法事实上非常easy: 第一步:设置Mu ...

  6. git push -u origin master 上传出错问题

    ============================================ 跟着廖学锋教程初学git发现个很奇怪的问题,后面原来发现是这样,有点逗.. ================= ...

  7. 【web开发--js学习】functionName 如果是一个属性值,函数将不会被调用

    <html> <head> <meta http-equiv="Content-Type" Content="text/html; char ...

  8. Android studio教程:[1] 创建app项目

    Android studio作为面市不久的安卓开发工具,越来越受到大家的喜爱,这里我将介绍如何在Android studio中创建一个APP项目,并在以后经验中介绍其他有关Android studio ...

  9. C++中把string转成char

    c_str函数的返回值是const char*的,不能直接赋值给char*, c++语言提供了两种字符串实现,其中较原始的一种只是字符串的c语言实现. 与C语言的其他部分一样,它在c+的所有实现中可用 ...

  10. JQ兼容各种JS库的写法

    来自为知笔记(Wiz)