.net/c# memcached缓存获取所有缓存键的方法步骤
使用组件
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[i]); if (sock == null) { //if(log.IsErrorEnabled) //{ // log.Error(GetLocalizedString("unable to connect").Replace("$$Server$$", servers[i].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[i]] = 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 文章中有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 />"); }