MemCachedManager.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Data.Common;
  6. using System.Web;
  7. using System.IO;
  8. using Memcached.ClientLibrary;
  9. namespace CB.Cache.MemCached
  10. {
  11. /// <summary>
  12. /// MemCache管理操作类
  13. /// </summary>
  14. public sealed class MemCachedManager
  15. {
  16. private static MemcachedClient mc = null;
  17. private static SockIOPool pool = null;
  18. private static string[] serverList = null;
  19. private static MemCachedConfigInfo memCachedConfigInfo = MemCachedConfig.GetConfig();
  20. static MemCachedManager()
  21. {
  22. CreateManager();
  23. }
  24. private static void CreateManager()
  25. {
  26. serverList = memCachedConfigInfo.ServerList;
  27. pool = SockIOPool.GetInstance(memCachedConfigInfo.PoolName);
  28. pool.SetServers(serverList);
  29. pool.InitConnections = memCachedConfigInfo.InitConnections;//初始化链接数
  30. pool.MinConnections = memCachedConfigInfo.MinConnections;//最少链接数
  31. pool.MaxConnections = memCachedConfigInfo.MaxConnections;//最大连接数
  32. pool.SocketConnectTimeout = memCachedConfigInfo.SocketConnectTimeout;//Socket链接超时时间
  33. pool.SocketTimeout = memCachedConfigInfo.SocketTimeout;// Socket超时时间
  34. pool.MaintenanceSleep = memCachedConfigInfo.MaintenanceSleep;//维护线程休息时间
  35. pool.Failover = memCachedConfigInfo.FailOver; //失效转移(一种备份操作模式)
  36. pool.Nagle = memCachedConfigInfo.Nagle;//是否用nagle算法启动socket
  37. pool.HashingAlgorithm = HashingAlgorithm.NewCompatibleHash;
  38. pool.Initialize();
  39. mc = new MemcachedClient();
  40. mc.PoolName = memCachedConfigInfo.PoolName;
  41. mc.EnableCompression = false;
  42. }
  43. public enum Stats
  44. {
  45. Reset,
  46. Malloc,
  47. Maps,
  48. Sizes,
  49. Slabs,
  50. Items,
  51. CachedDump,
  52. Detail
  53. }
  54. /// <summary>
  55. /// 直接对memcached操作socket
  56. /// </summary>
  57. /// <param name="serverArrayList"></param>
  58. /// <param name="statsCommand"></param>
  59. /// <param name="param"></param>
  60. /// <returns></returns>
  61. public static ArrayList GetStats(ArrayList serverArrayList, Stats statsCommand, string param)
  62. {
  63. ArrayList statsArray = new ArrayList();
  64. param = string.IsNullOrEmpty(param) ? "" : param.Trim().ToLower();
  65. string commandstr = "stats";
  66. //转换stats命令参数
  67. switch (statsCommand)
  68. {
  69. case Stats.Reset: { commandstr = "stats reset"; break; }
  70. case Stats.Malloc: { commandstr = "stats malloc"; break; }
  71. case Stats.Maps: { commandstr = "stats maps"; break; }
  72. case Stats.Sizes: { commandstr = "stats sizes"; break; }
  73. case Stats.Slabs: { commandstr = "stats slabs"; break; }
  74. case Stats.Items: { commandstr = "stats items"; break; }
  75. case Stats.CachedDump:
  76. {
  77. string[] statsparams = param.Split(' ');
  78. if (statsparams.Length == 2)
  79. commandstr = "stats cachedump " + param;
  80. break;
  81. }
  82. case Stats.Detail:
  83. {
  84. if (string.Equals(param, "on") || string.Equals(param, "off") || string.Equals(param, "dump"))
  85. commandstr = "stats detail " + param.Trim();
  86. break;
  87. }
  88. default: { commandstr = "stats"; break; }
  89. }
  90. //加载返回值
  91. Hashtable stats = MemCachedManager.CacheClient.Stats(serverArrayList, commandstr);
  92. foreach (string key in stats.Keys)
  93. {
  94. statsArray.Add(key);
  95. Hashtable values = (Hashtable)stats[key];
  96. foreach (string key2 in values.Keys)
  97. {
  98. statsArray.Add(key2 + ":" + values[key2]);
  99. }
  100. }
  101. return statsArray;
  102. }
  103. /// <summary>
  104. /// 获取所有缓存key
  105. /// </summary>
  106. /// <returns></returns>
  107. public static List<string> GetKeys()
  108. {
  109. List<string> list = new List<string>();
  110. ArrayList itemarr = new ArrayList();
  111. ArrayList arrayList = new ArrayList();
  112. foreach (string server in MemCachedManager.ServerList)
  113. {
  114. arrayList.Add(server);
  115. }
  116. ArrayList arr = GetStats(arrayList, MemCachedManager.Stats.Items, null);
  117. foreach (string a in arr)
  118. {
  119. string[] tmparr = a.Split(':');
  120. if (tmparr.Length > 1)
  121. {
  122. int item_id = 0;
  123. int.TryParse(tmparr[1], out item_id);
  124. bool find = false;
  125. foreach (int item in itemarr)
  126. {
  127. if (item == item_id)
  128. find = true;
  129. }
  130. if (!find && item_id > 0 && item_id != 11211)
  131. itemarr.Add(item_id);
  132. }
  133. }
  134. foreach (int item in itemarr)
  135. {
  136. ArrayList cachearr = MemCachedManager.GetStats(arrayList, MemCachedManager.Stats.CachedDump, "" + item + " 10");
  137. foreach (string cache in cachearr)
  138. {
  139. if (cache.IndexOf("11211") == -1)
  140. {
  141. string[] strs = cache.Split(':');
  142. list.Add(strs[0]);
  143. }
  144. }
  145. }
  146. return list;
  147. }
  148. /// <summary>
  149. /// 缓存服务器地址列表
  150. /// </summary>
  151. public static string[] ServerList
  152. {
  153. set
  154. {
  155. if (value != null)
  156. serverList = value;
  157. }
  158. get { return serverList; }
  159. }
  160. /// <summary>
  161. /// 客户端缓存操作对象
  162. /// </summary>
  163. public static MemcachedClient CacheClient
  164. {
  165. get
  166. {
  167. if (mc == null)
  168. CreateManager();
  169. return mc;
  170. }
  171. }
  172. public static void Dispose()
  173. {
  174. if (pool != null)
  175. pool.Shutdown();
  176. }
  177. }
  178. }