设为首页 收藏本站
查看: 811|回复: 0

[经验分享] .net/c# memcached 获取所有缓存键(keys)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-9-1 07:38:23 | 显示全部楼层 |阅读模式
  使用组件
  memcached 1.2.6
  .net 类库 memcacheddotnet_clientlib-1.1.5
  
  
  
  1.增加memcacheddotnet_clientlib-1.1.5代码
  下载好组件后,用vs打开.net类库memcacheddotnet_clientlib-1.1.5,打开MemCachedClient.cs,增加如下方法:



public Hashtable Stats(ArrayList servers, string command)
{
// get SockIOPool instance
SockIOPool pool = SockIOPool.GetInstance(_poolName);
// return false if unable to get SockIO obj
if (pool == null)
{
//if(log.IsErrorEnabled)
//{
//    log.Error(GetLocalizedString("unable to get socket pool"));
//}
return null;
}
// get all servers and iterate over them
if (servers == null)
servers = pool.Servers;
// if no servers, then return early
if (servers == null || servers.Count <= 0)
{
//if(log.IsErrorEnabled)
//{
//    log.Error(GetLocalizedString("stats no servers"));
//}
return null;
}
// array of stats Hashtables
Hashtable statsMaps = new Hashtable();
for (int i = 0; i < servers.Count; i++)
{
SockIO sock = pool.GetConnection((string)servers);
if (sock == null)
{
//if(log.IsErrorEnabled)
//{
//    log.Error(GetLocalizedString("unable to connect").Replace("$$Server$$", servers.ToString()));
//}
continue;
}
// build command
if (command == null || command.Length == 0)
{
command = "stats\r\n";
}
else
{
command = command + "\r\n";
}
try
{
sock.Write(UTF8Encoding.UTF8.GetBytes(command));
sock.Flush();
// map to hold key value pairs
Hashtable stats = new Hashtable();
// loop over results
while (true)
{
string line = sock.ReadLine();
//if(log.IsDebugEnabled)
//{
//    log.Debug(GetLocalizedString("stats line").Replace("$$Line$$", line));
//}
if (line.StartsWith(STATS))
{
string[] info = line.Split(' ');
string key = info[1];
string val = info[2];
//if(log.IsDebugEnabled)
//{
//    log.Debug(GetLocalizedString("stats success").Replace("$$Key$$", key).Replace("$$Value$$", val));
//}
stats[key] = val;
}
else if (line.StartsWith("ITEM"))
{
string[] info = line.Split('[');
string key = info[0].Split(' ')[1];
string val = "[" + info[1];
stats[key] = val;
}
else if (END == line)
{
// finish when we get end from server
//if(log.IsDebugEnabled)
//{
//    log.Debug(GetLocalizedString("stats finished"));
//}
break;
}
statsMaps[servers] = stats;
}
}
catch//(IOException e)
{
//if(log.IsErrorEnabled)
//{
//    log.Error(GetLocalizedString("stats IOException"), e);
//}
try
{
sock.TrueClose();
}
catch//(IOException)
{
//if(log.IsErrorEnabled)
//{
//    log.Error(GetLocalizedString("failed to close some socket").Replace("$$Socket$$", sock.ToString()));
//}
}
sock = null;
}
if (sock != null)
sock.Close();
}
return statsMaps;
}

  2.请看此文章http://www.cnblogs.com/daizhj/archive/2009/03/23/1386652.html
  文章中有GetStats方法,将它修改如下:



/// <summary>
/// 获取服务器端缓存的数据信息
/// </summary>
/// <param name="serverArrayList">要访问的服务列表</param>
/// <param name="statsCommand">此参数的功能暂时无效</param>
/// <param name="param">此参数的功能暂时无效</param>
/// <returns>返回信息</returns>
public static IList<string> GetStats(IList<string> serverArrayList, MemcachedStats statsCommand, string param)
{
IList<string> statsArray = new List<string>();
if (param == null)
param = "";
else
{
param = param.Trim().ToLower();
}
string commandstr = "stats";
//转换stats命令参数
switch (statsCommand)
{
case MemcachedStats.Reset: { commandstr = "stats reset"; break; }
case MemcachedStats.Malloc: { commandstr = "stats malloc"; break; }
case MemcachedStats.Maps: { commandstr = "stats maps"; break; }
case MemcachedStats.Sizes: { commandstr = "stats sizes"; break; }
case MemcachedStats.Slabs: { commandstr = "stats slabs"; break; }
case MemcachedStats.Items: { commandstr = "stats items"; break; }//此处原先是返回stats
case MemcachedStats.CachedDump:
{
string[] statsparams = param.Split(' ');
if (statsparams.Length == 2)
if (param.IsIntArr(' '))// Utils.IsNumericArray(statsparams)
commandstr = "stats cachedump  " + param;
break;
}
case MemcachedStats.Detail:
{
if (string.Equals(param, "on") || string.Equals(param, "off") || string.Equals(param, "dump"))
commandstr = "stats detail " + param.Trim();
break;
}
default: { commandstr = "stats"; break; }
}
ArrayList arr = new ArrayList(serverArrayList.ToArray());
Hashtable stats = MemcachedManager.CacheClient.Stats(arr, commandstr);
foreach (string key in stats.Keys)
{
statsArray.Add("server:__:" + key);//此处也改了
Hashtable values = (Hashtable)stats[key];
foreach (string key2 in values.Keys)
{
statsArray.Add(key2 + ":" + values[key2]);
}
}
return statsArray;
}

  3.最后增加如下方法



/// <summary>
/// 获取所有缓存键
/// </summary>
/// <returns></returns>
public static IList<string> GetAllKeys()
{
IList<int> idList = new List<int>();
IList<string> list = MemcachedManager.GetStats(MemcachedManager.ServerList, MemcachedStats.Items, null);
foreach (var item in list)
{
string[] tmpArr = item.Split(':');
if (tmpArr.Length > 1)
{
int itemID = 0;
if (tmpArr[1] == "__") continue;
int.TryParse(tmpArr[1], out itemID);
if (itemID <= 0) continue;
bool find = false;
foreach (int item1 in idList)
{
if (item1 == itemID)
{
find = true;
break;
}
}
if (!find)
{
idList.Add(itemID);
}
}
}
IList<string> keys = new List<string>();
foreach (int item in idList)
{
IList<string> cachearr = MemcachedManager.GetStats(MemcachedManager.ServerList, MemcachedStats.CachedDump, item + " 0");
foreach (string itemCache in cachearr)
{
string[] tmpArr = itemCache.Split(':');
if (tmpArr.Length > 1)
{
if (tmpArr[1] == "__")
{
continue;
}
keys.Add(tmpArr[0]);
}
}
}
return keys;
}

  调用方法



IList<string> list = MemcachedManager.GetAllKeys();
foreach (var item in list)
{
Response.Write(item + "<br />");
}

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-108085-1-1.html 上篇帖子: 用FreeBSD与memcached建立分布式缓存服务器全程记录之freebsd下载安装 下篇帖子: Memcached的stats命令(命令行查看Memcached运行状态)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表