說明:Memcached 分為服務器端和客戶端, 客戶端有多種實現方式,我這里是選擇了這個版本 http://sourceforge.net/projects/memcacheddotnet/?source=dlp
第 1 步: 配置環境
1.下載服務器memcached for win32安裝。http://www.splinedancer.com/memcached-win32/,www.splinedancer.com/memcached-win32/memcached-1.2.4-Win32-Preview-20080309_bin.zip
我在源碼文件 服務器設置 里面附帶了memcached.exe,把memcached.exe這個文件拷貝到C盤新建 文件夾 C:\memcached-1.2.6
2.用管理員方式開口cmd命令窗口 輸入: cd C:\memcached-1.2.6 然后輸入memcached.exe -d install 就可以把memcached安裝為windows服務了。
3.啟動服務后,memcached服務默認占用的端口是11211,占用的最大內存默認是64M。
4.可以自己修改端口號,但是需要修改注冊表
打開注冊表,找到:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server
其中的ImagePath項的值為:"c:\memcached-1.2.6\memcached.exe" -d runservice
改成:"c:\memcached-1.2.6\memcached.exe" -p 12345 -m 1024 -d runservice
表示可以 緩存 1G數據。端口 12345
第 2 步: 打開Visual Studio 2010 ,新建項目www.memcached.com,這步我就省略了。
第 3步: 添加緩存幫組文件
using System; using System.Web; using System.Linq; using System.Collections; using System.Collections.Specialized; using System.Collections.Generic; using System.Configuration; using Memcached.ClientLibrary; namespace www.memcached.com { /// <summary> /// 頁 面 名:緩存管理類<br/> /// 說 明:設置、獲取、移除Cache<br/> /// 作 者:xxx<br/> /// 時 間:2012-12-12(神奇的數字,傳說中的12K)<br/> /// 修 改 者:<br/> /// 修改時間:<br/> /// </summary> public class CacheHelper { #region 變量和構造函數 //緩存服務器地址和端口,這樣就實現了分布式緩存。服務器可以多個,用Socket讀寫數據"127.0.0.1:12345", private static Dictionary<string, string> Servers = new Dictionary<string, string>(); static MemcachedClient mc = null; //服務器緩存 static Dictionary<string, SockIOPool> Servers1 = new Dictionary<string, SockIOPool>(); static object LOCK_OBJECT = new object();//安全鎖定 /// <summary> /// 靜態構造函數 /// </summary> static CacheHelper() { InitServer(); List<string> keys = Servers.Keys.ToList<string>(); foreach (var k in Servers.Keys) { SockIOPool pool = SockIOPool.GetInstance(k); string[] s = new string[] { Servers[k] }; pool.SetServers(s);//設置服務器 pool.MaxConnections = 10000; pool.MinConnections = 10; pool.SocketConnectTimeout = 1000; pool.SocketTimeout = 100; pool.Initialize();//初始化緩存線程池 } //默認池 List<string> defaultServerList=new List<string>(); foreach (var k in Servers.Keys) defaultServerList.Add(Servers[k]); SockIOPool defaultPool = SockIOPool.GetInstance("DefaultPool"); defaultPool.SetServers(defaultServerList.ToArray());//設置服務器 defaultPool.MaxConnections = 10000; defaultPool.MinConnections = 10; defaultPool.SocketConnectTimeout = 1000; defaultPool.SocketTimeout = 100; defaultPool.Initialize(); //初始化默認線程池 mc = new MemcachedClient(); mc.PoolName = "DefaultPool"; } /// <summary> /// 初始化服務器列表,這里默認兩台服務器. /// </summary> static void InitServer(){ //這里可以寫復雜靈活點,動態從配置文件獲取,我這里固定了兩個 Servers.Add("Svr1", ConfigurationManager.AppSettings["Svr1"]); Servers.Add("Svr2", ConfigurationManager.AppSettings["Svr2"]); } private CacheHelper() { } #endregion #region 獲取客戶端 public static MemcachedClient GetClient(string server) { MemcachedClient current = Singleton<MemcachedClient>.Instance; current.PoolName = server; return current; } #endregion #region 默認 #region 寫(Set) /// <summary> /// 設置數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> public static void Set(string key, object value) { mc.Set(key, value); } /// <summary> /// 設置數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="hashCode">哈希碼</param> public static void Set(string key, object value, int hashCode) { mc.Set(key, value, hashCode); } /// <summary> /// 設置數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="expiry">過期時間</param> public static void Set(string key, object value, DateTime expiry) { mc.Set(key, value, expiry); } /// <summary> /// 設置數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="expiry">過期時間</param> public static void Set(string key, object value, DateTime expiry, int hashCode) { mc.Set(key, value, expiry, hashCode); } #endregion #region 讀(Get) #region 返回泛型 /// <summary> /// 讀取數據緩存 /// </summary> /// <param name="key">鍵</param> public static T Get<T>(string key) { return (T)mc.Get(key); } /// <summary> /// 讀取數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="hashCode">哈希碼</param> public static T Get<T>(string key, int hashCode) { return (T)mc.Get(key, hashCode); } /// <summary> /// 讀取數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="asString">是否把值作為字符串返回</param> public static T Get<T>(string key, object value, bool asString) { return (T)mc.Get(key, value, asString); } #endregion /// <summary> /// 讀取數據緩存 /// </summary> /// <param name="key">鍵</param> public static object Get(string key) { return mc.Get(key); } /// <summary> /// 讀取數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="hashCode">哈希碼</param> public static object Get(string key, int hashCode) { return mc.Get(key, hashCode); } /// <summary> /// 讀取數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="asString">是否把值作為字符串返回</param> public static object Get(string key, object value, bool asString) { return mc.Get(key, value, asString); } #endregion #region 批量寫(Set) /// <summary> /// 批量設置數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> public static void SetMultiple(string[] keys, object[] values) { for (int i = 0; i < keys.Length; i++) { mc.Set(keys[i], values[i]); } } /// <summary> /// 批量設置數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="hashCode">哈希碼</param> public static void SetMultiple(string[] keys, object[] values, int[] hashCodes) { for (int i = 0; i < keys.Length; i++) { mc.Set(keys[i], values[i], hashCodes[i]); } } /// <summary> /// 批量設置數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="expiry">過期時間</param> public static void SetMultiple(string[] keys, object[] values, DateTime[] expirys) { for (int i = 0; i < keys.Length; i++) { mc.Set(keys[i], values[i], expirys[i]); } } /// <summary> /// 批量設置數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="expiry">過期時間</param> public static void Set(string[] keys, object[] values, DateTime[] expirys, int[] hashCodes) { for (int i = 0; i < keys.Length; i++) { mc.Set(keys[i], values[i], expirys[i], hashCodes[i]); } } #endregion #region 批量讀取(Multiple),返回哈希表 Hashtable /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> public static Hashtable GetMultiple(string[] keys) { return mc.GetMultiple(keys); } /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> /// <param name="hashCodes">哈希碼集合</param> public static Hashtable GetMultiple(string[] keys, int[] hashCodes) { return mc.GetMultiple(keys, hashCodes); } /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> /// <param name="hashCodes">哈希碼集合</param> /// <param name="asString">所有值返回字符</param> public static Hashtable GetMultiple(string[] keys, int[] hashCodes, bool asString) { return mc.GetMultiple(keys, hashCodes, asString); } #endregion #region 批量讀取(Multiple),返回對象數組object[] /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> public static object[] GetMultipleArray(string[] keys) { return mc.GetMultipleArray(keys); } /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> /// <param name="hashCodes">哈希碼集合</param> public static object[] GetMultipleArray(string[] keys, int[] hashCodes) { return mc.GetMultipleArray(keys, hashCodes); } /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> /// <param name="hashCodes">哈希碼集合</param> /// <param name="asString">所有值返回字符</param> public static object[] GetMultipleArray(string[] keys, int[] hashCodes, bool asString) { return mc.GetMultipleArray(keys, hashCodes, asString); } #endregion #region 批量讀取(Multiple),返回泛型集合List[T] /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> public static List<T> GetMultipleList<T>(string[] keys) { object[] obj = mc.GetMultipleArray(keys); List<T> list = new List<T>(); foreach (object o in obj) { list.Add((T)o); } return list; } /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> /// <param name="hashCodes">哈希碼集合</param> public static List<T> GetMultipleList<T>(string[] keys, int[] hashCodes) { object[] obj = mc.GetMultipleArray(keys, hashCodes); List<T> list = new List<T>(); foreach (object o in obj) { list.Add((T)o); } return list; } /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> /// <param name="hashCodes">哈希碼集合</param> /// <param name="asString">所有值返回字符</param> public static List<T> GetMultipleList<T>(string[] keys, int[] hashCodes, bool asString) { object[] obj = mc.GetMultipleArray(keys, hashCodes, asString); List<T> list = new List<T>(); foreach (object o in obj) { list.Add((T)o); } return list; } #endregion #region 替換更新(Replace) /// <summary> /// 替換更新數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> public static void Replace(string key, object value) { mc.Replace(key, value); } /// <summary> /// 替換更新數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="hashCode">哈希碼</param> public static void Replace(string key, object value, int hashCode) { mc.Replace(key, value, hashCode); } /// <summary> /// 替換更新數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="expiry">過期時間</param> public static void Replace(string key, object value, DateTime expiry) { mc.Replace(key, value, expiry); } /// <summary> /// 替換更新數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="expiry">過期時間</param> public static void Replace(string key, object value, DateTime expiry, int hashCode) { mc.Replace(key, value, expiry, hashCode); } #endregion #region 刪除(Delete) /// <summary> ///刪除指定條件緩存 /// </summary> /// <param name="key">鍵</param> public static bool Delete(string key) { return mc.Delete(key); } /// <summary> /// 刪除指定條件緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="hashCode">哈希碼</param> /// <param name="expiry">過期時間</param> public static bool Delete(string key, int hashCode, DateTime expiry) { return mc.Delete(key, hashCode, expiry); } /// <summary> /// 刪除指定條件緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="expiry">過期時間</param> public static bool Delete(string key, DateTime expiry) { return mc.Delete(key, expiry); } /// <summary> /// 移除全部緩存 /// </summary> public static void RemovAllCache() { mc.FlushAll(); } /// <summary> /// 移除全部緩存 /// </summary> /// <param name="list">移除指定服務器緩存</param> public static void RemovAllCache(ArrayList list) { mc.FlushAll(list); } #endregion #region 是否存在(Exists) /// <summary> /// 判斷指定鍵的緩存是否存在 /// </summary> /// <param name="key">鍵</param> /// <returns></returns> public static bool IsExists(string key) { return mc.KeyExists(key); } #endregion #region 數值增減 #region 存儲一個數值元素 /// <summary> /// 存儲一個數值元素 /// </summary> /// <param name="key">鍵</param> /// <returns></returns> public static bool StoreCounter(string key, long counter) { return mc.StoreCounter(key, counter); } /// <summary> /// 存儲一個數值元素 /// </summary> /// <param name="key">鍵</param> /// <param name="inc">增長幅度</param> /// <param name="hashCode">哈希碼</param> /// <returns></returns> public static bool StoreCounter(string key, long counter, int hashCode) { return mc.StoreCounter(key, counter, hashCode); } #endregion #region 獲取一個數值元素 /// <summary> /// 獲取一個數值元素 /// </summary> /// <param name="key">鍵</param> /// <returns></returns> public static long GetCounter(string key) { return mc.GetCounter(key); } /// <summary> /// 獲取一個數值元素 /// </summary> /// <param name="key">鍵</param> /// <param name="hashCode">哈希碼</param> /// <returns></returns> public static long GetCounter(string key, int hashCode) { return mc.GetCounter(key, hashCode); } #endregion #region 增加一個數值元素的值(Increment) /// <summary> /// 將一個數值元素增加。 如果元素的值不是數值類型,將其作為0處理 /// </summary> /// <param name="key">鍵</param> /// <returns></returns> public static long Increment(string key) { return mc.Increment(key); } /// <summary> /// 將一個數值元素增加。 如果元素的值不是數值類型,將其作為0處理 /// </summary> /// <param name="key">鍵</param> /// <param name="inc">增長幅度</param> /// <returns></returns> public static long Increment(string key, long inc) { return mc.Increment(key, inc); } /// <summary> /// 將一個數值元素增加。 如果元素的值不是數值類型,將其作為0處理 /// </summary> /// <param name="key">鍵</param> /// <param name="inc">增長幅度</param> /// <param name="hashCode">哈希碼</param> /// <returns></returns> public static long Increment(string key, long inc, int hashCode) { return mc.Increment(key, inc, hashCode); } #endregion #region 減小一個數值元素的值(Decrement) /// <summary> /// 減小一個數值元素的值,減小多少由參數offset決定。 如果元素的值不是數值,以0值對待。如果減小后的值小於0,則新的值被設置為0 /// </summary> /// <param name="key">鍵</param> /// <returns></returns> public static long Decrement(string key) { return mc.Decrement(key); } /// <summary> /// 減小一個數值元素的值,減小多少由參數offset決定。 如果元素的值不是數值,以0值對待。如果減小后的值小於0,則新的值被設置為0 /// </summary> /// <param name="key">鍵</param> /// <param name="inc">增長幅度</param> /// <returns></returns> public static long Decrement(string key, long inc) { return mc.Decrement(key, inc); } /// <summary> /// 減小一個數值元素的值,減小多少由參數offset決定。 如果元素的值不是數值,以0值對待。如果減小后的值小於0,則新的值被設置為0 /// </summary> /// <param name="key">鍵</param> /// <param name="inc">增長幅度</param> /// <param name="hashCode">哈希碼</param> /// <returns></returns> public static long Decrement(string key, long inc, int hashCode) { return mc.Decrement(key, inc, hashCode); } #endregion #endregion #endregion #region 指定服務器 #region 獲取(Get) /// <summary> /// 從指定服務器獲取 /// </summary> /// <param name="server">服務器,Svr1,Svr2</param> /// <param name="key">鍵</param> /// <returns></returns> public static object GetFrom(string server,string key) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.Get(key); } /// <summary> /// 從指定服務器獲取 /// </summary> /// <param name="server">服務器,Svr1,Svr2</param> /// <param name="key">鍵</param> /// <param name="hashCode">哈希碼</param> public static object GetFrom(string server, string key, int hashCode) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.Get(key, hashCode); } /// <summary> /// 從指定服務器獲取 /// </summary> /// <param name="server">服務器,Svr1,Svr2</param> /// <param name="key">鍵</param> /// <param name="asString">是否把值作為字符串返回</param> public static object GetFrom(string server, string key, object value, bool asString) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.Get(key, value, asString); } #endregion #region 寫入(Set) /// <summary> /// 設置數據緩存 /// </summary> /// <param name="server">服務器,格式為Svr1,Svr2,Svr3,對應配置文件host</param> /// <param name="key">鍵</param> /// <param name="value">值</param> public static void SetTo(string server,string key, object value) { MemcachedClient client = GetClient(server); client.PoolName = server; client.Set(key, value); } /// <summary> /// 設置數據緩存 /// </summary> /// <param name="server">服務器,格式為Svr1,Svr2,Svr3,對應配置文件host</param> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="hashCode">哈希碼</param> public static void SetTo(string server, string key, object value, int hashCode) { MemcachedClient client = GetClient(server); client.PoolName = server; client.Set(key, value, hashCode); } /// <summary> /// 設置數據緩存 /// </summary> /// <param name="server">服務器,格式為Svr1,Svr2,Svr3,對應配置文件host</param> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="expiry">過期時間</param> public static void SetTo(string server, string key, object value, DateTime expiry) { MemcachedClient client = GetClient(server); client.PoolName = server; client.Set(key, value, expiry); } /// <summary> /// 設置數據緩存 /// </summary> /// <param name="server">服務器,格式為Svr1,Svr2,Svr3,對應配置文件host</param> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="expiry">過期時間</param> public static void SetTo(string server, string key, object value, DateTime expiry, int hashCode) { MemcachedClient client = GetClient(server); client.PoolName = server; client.Set(key, value, expiry, hashCode); } #endregion #region 批量寫(Set) /// <summary> /// 批量設置數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> public static void SetMultipleTo(string server, string[] keys, object[] values) { MemcachedClient client = GetClient(server); client.PoolName = server; for (int i = 0; i < keys.Length; i++) { client.Set(keys[i], values[i]); } } /// <summary> /// 批量設置數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="hashCode">哈希碼</param> public static void SetMultipleTo(string server, string[] keys, object[] values, int[] hashCodes) { MemcachedClient client = GetClient(server); client.PoolName = server; for (int i = 0; i < keys.Length; i++) { client.Set(keys[i], values[i], hashCodes[i]); } } /// <summary> /// 批量設置數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="expiry">過期時間</param> public static void SetMultipleTo(string server, string[] keys, object[] values, DateTime[] expirys) { MemcachedClient client = GetClient(server); client.PoolName = server; for (int i = 0; i < keys.Length; i++) { client.Set(keys[i], values[i], expirys[i]); } } /// <summary> /// 批量設置數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="expiry">過期時間</param> public static void SetMultipleTo(string server, string[] keys, object[] values, DateTime[] expirys, int[] hashCodes) { MemcachedClient client = GetClient(server); client.PoolName = server; for (int i = 0; i < keys.Length; i++) { client.Set(keys[i], values[i], expirys[i], hashCodes[i]); } } #endregion #region 批量讀取(Multiple),返回哈希表 Hashtable /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> public static Hashtable GetMultipleFrom(string server,string[] keys) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.GetMultiple(keys); } /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> /// <param name="hashCodes">哈希碼集合</param> public static Hashtable GetMultipleFrom(string server, string[] keys, int[] hashCodes) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.GetMultiple(keys, hashCodes); } /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> /// <param name="hashCodes">哈希碼集合</param> /// <param name="asString">所有值返回字符</param> public static Hashtable GetMultipleFrom(string server, string[] keys, int[] hashCodes, bool asString) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.GetMultiple(keys, hashCodes, asString); } #endregion #region 批量讀取(Multiple),返回對象數組object[] /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> public static object[] GetMultipleArrayFrom(string server, string[] keys) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.GetMultipleArray(keys); } /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> /// <param name="hashCodes">哈希碼集合</param> public static object[] GetMultipleArrayFrom(string server, string[] keys, int[] hashCodes) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.GetMultipleArray(keys, hashCodes); } /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> /// <param name="hashCodes">哈希碼集合</param> /// <param name="asString">所有值返回字符</param> public static object[] GetMultipleArrayFrom(string server, string[] keys, int[] hashCodes, bool asString) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.GetMultipleArray(keys, hashCodes, asString); } #endregion #region 批量讀取(Multiple),返回泛型集合List[T] /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> public static List<T> GetMultipleListFrom<T>(string server, string[] keys) { MemcachedClient client = GetClient(server); client.PoolName = server; object[] obj = client.GetMultipleArray(keys); List<T> list = new List<T>(); foreach (object o in obj) { list.Add((T)o); } return list; } /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> /// <param name="hashCodes">哈希碼集合</param> public static List<T> GetMultipleListFrom<T>(string server, string[] keys, int[] hashCodes) { MemcachedClient client = GetClient(server); client.PoolName = server; object[] obj = client.GetMultipleArray(keys, hashCodes); List<T> list = new List<T>(); foreach (object o in obj) { list.Add((T)o); } return list; } /// <summary> /// 批量讀取數據緩存 /// </summary> /// <param name="keys">鍵集合</param> /// <param name="hashCodes">哈希碼集合</param> /// <param name="asString">所有值返回字符</param> public static List<T> GetMultipleListFrom<T>(string server, string[] keys, int[] hashCodes, bool asString) { MemcachedClient client = GetClient(server); client.PoolName = server; object[] obj = client.GetMultipleArray(keys, hashCodes, asString); List<T> list = new List<T>(); foreach (object o in obj) { list.Add((T)o); } return list; } #endregion #region 替換更新(Replace) /// <summary> /// 替換更新數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> public static void ReplaceFrom(string server, string key, object value) { MemcachedClient client = GetClient(server); client.PoolName = server; client.Replace(key, value); } /// <summary> /// 替換更新數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="hashCode">哈希碼</param> public static void ReplaceFrom(string server, string key, object value, int hashCode) { MemcachedClient client = GetClient(server); client.PoolName = server; client.Replace(key, value, hashCode); } /// <summary> /// 替換更新數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="expiry">過期時間</param> public static void ReplaceFrom(string server, string key, object value, DateTime expiry) { MemcachedClient client = GetClient(server); client.PoolName = server; client.Replace(key, value, expiry); } /// <summary> /// 替換更新數據緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="value">值</param> /// <param name="expiry">過期時間</param> public static void ReplaceFrom(string server, string key, object value, DateTime expiry, int hashCode) { MemcachedClient client = GetClient(server); client.PoolName = server; client.Replace(key, value, expiry, hashCode); } #endregion #region 刪除(Delete) /// <summary> ///刪除指定條件緩存 /// </summary> /// <param name="key">鍵</param> public static bool DeleteFrom(string server, string key) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.Delete(key); } /// <summary> /// 刪除指定條件緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="hashCode">哈希碼</param> /// <param name="expiry">過期時間</param> public static bool DeleteFrom(string server, string key, int hashCode, DateTime expiry) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.Delete(key, hashCode, expiry); } /// <summary> /// 刪除指定條件緩存 /// </summary> /// <param name="key">鍵</param> /// <param name="expiry">過期時間</param> public static bool DeleteFrom(string server, string key, DateTime expiry) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.Delete(key, expiry); } /// <summary> /// 移除全部緩存 /// </summary> public static void RemovAllCacheFrom(string server) { MemcachedClient client = GetClient(server); client.PoolName = server; client.FlushAll(); } /// <summary> /// 移除全部緩存 /// </summary> /// <param name="list">移除指定服務器緩存</param> public static void RemovAllCacheFrom(string server, ArrayList list) { MemcachedClient client = GetClient(server); client.PoolName = server; client.FlushAll(list); } #endregion #region 是否存在(Exists) /// <summary> /// 判斷指定鍵的緩存是否存在 /// </summary> /// <param name="key">鍵</param> /// <returns></returns> public static bool IsExists(string server,string key) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.KeyExists(key); } #endregion #region 數值增減 #region 存儲一個數值元素 /// <summary> /// 存儲一個數值元素 /// </summary> /// <param name="key">鍵</param> /// <returns></returns> public static bool StoreCounterTo(string server,string key, long counter) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.StoreCounter(key, counter); } /// <summary> /// 存儲一個數值元素 /// </summary> /// <param name="key">鍵</param> /// <param name="inc">增長幅度</param> /// <param name="hashCode">哈希碼</param> /// <returns></returns> public static bool StoreCounterTo(string server, string key, long counter, int hashCode) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.StoreCounter(key, counter, hashCode); } #endregion #region 獲取一個數值元素 /// <summary> /// 獲取一個數值元素 /// </summary> /// <param name="key">鍵</param> /// <returns></returns> public static long GetCounterFrom(string server, string key) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.GetCounter(key); } /// <summary> /// 獲取一個數值元素 /// </summary> /// <param name="key">鍵</param> /// <param name="hashCode">哈希碼</param> /// <returns></returns> public static long GetCounterFrom(string server, string key, int hashCode) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.GetCounter(key, hashCode); } #endregion #region 增加一個數值元素的值(Increment) /// <summary> /// 將一個數值元素增加。 如果元素的值不是數值類型,將其作為0處理 /// </summary> /// <param name="key">鍵</param> /// <returns></returns> public static long IncrementTo(string server, string key) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.Increment(key); } /// <summary> /// 將一個數值元素增加。 如果元素的值不是數值類型,將其作為0處理 /// </summary> /// <param name="key">鍵</param> /// <param name="inc">增長幅度</param> /// <returns></returns> public static long IncrementTo(string server, string key, long inc) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.Increment(key, inc); } /// <summary> /// 將一個數值元素增加。 如果元素的值不是數值類型,將其作為0處理 /// </summary> /// <param name="key">鍵</param> /// <param name="inc">增長幅度</param> /// <param name="hashCode">哈希碼</param> /// <returns></returns> public static long IncrementTo(string server, string key, long inc, int hashCode) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.Increment(key, inc, hashCode); } #endregion #region 減小一個數值元素的值(Decrement) /// <summary> /// 減小一個數值元素的值,減小多少由參數offset決定。 如果元素的值不是數值,以0值對待。如果減小后的值小於0,則新的值被設置為0 /// </summary> /// <param name="key">鍵</param> /// <returns></returns> public static long DecrementFrom(string server, string key) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.Decrement(key); } /// <summary> /// 減小一個數值元素的值,減小多少由參數offset決定。 如果元素的值不是數值,以0值對待。如果減小后的值小於0,則新的值被設置為0 /// </summary> /// <param name="key">鍵</param> /// <param name="inc">增長幅度</param> /// <returns></returns> public static long DecrementFrom(string server, string key, long inc) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.Decrement(key, inc); } /// <summary> /// 減小一個數值元素的值,減小多少由參數offset決定。 如果元素的值不是數值,以0值對待。如果減小后的值小於0,則新的值被設置為0 /// </summary> /// <param name="key">鍵</param> /// <param name="inc">增長幅度</param> /// <param name="hashCode">哈希碼</param> /// <returns></returns> public static long DecrementFrom(string server, string key, long inc, int hashCode) { MemcachedClient client = GetClient(server); client.PoolName = server; return client.Decrement(key, inc, hashCode); } #endregion #endregion #endregion } }
第 4步: 測試默認服務器
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using Memcached.ClientLibrary; namespace www.memcached.com { [Serializable] class A { public string Name { get; set; } } public partial class Test : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { CacheHelper.RemovAllCache(); /*例子1 保存復雜對象*/ A[] a = new A[] { new A { Name = "劉德華" }, new A { Name = "施瓦辛格" }, new A { Name = "太上老君" } }; CacheHelper.Set("name", a, DateTime.Now.AddSeconds(10)); object c = CacheHelper.Get("name"); A[] b = (A[])c; Response.Write(b[2].Name + "<br/>"); /*例子2 批量獲取對象*/ int[] array = { 1, 2, 3, 4, 5, 6, 7 }; foreach (int i in array) { CacheHelper.Set("array" + i, i); } string[] keys = { "array1", "array2", "array3", "array4", "array5", "array6", "array7" }; object[] obj = CacheHelper.GetMultipleArray(keys); foreach (object o in obj) { Response.Write(o + "<br/>"); } /*例子3 獲取泛型*/ A a3 = new A { Name = "我是對象" }; CacheHelper.Set("TType", a3); A a4 = CacheHelper.Get<A>("TType"); Response.Write(a4.Name + "<br/>"); /*例子4 刪除*/ try { Response.Write("刪除對象TType " + CacheHelper.Delete("TType") + "<br/>"); A a5 = CacheHelper.Get<A>("TType"); Response.Write(a5.Name + "<br/>"); } catch (Exception exe) { Response.Write("獲取對象報錯,說明對象已經刪除,錯誤信息是: " + exe.Message + "<br/>"); Response.Write("刪除對象后,判斷是否存在: CacheHelper.IsExists: " + CacheHelper.IsExists("TType") + "<br/>"); } /*例子5 增加,減少*/ long counter = 10; CacheHelper.StoreCounter("number", counter); Response.Write("number增加前是: " + CacheHelper.GetCounter("number") + "<br/>"); CacheHelper.Increment("number"); Response.Write("對number增加后是: " + CacheHelper.GetCounter("number") + "<br/>"); CacheHelper.Increment("number", 100); Response.Write("對number增加100后是: " + CacheHelper.GetCounter("number") + "<br/>"); CacheHelper.Decrement("number", 100); Response.Write("對number減去100后是: " + CacheHelper.GetCounter("number") + "<br/>"); /*例子6 批量讀取 泛型 測試*/ A[] a6 = new A[] { new A { Name = "李嘉圖" }, new A { Name = "亞當斯密" }, new A { Name = "蘇格拉底" } }; string[] k6 = { "economy1", "economy2", "economy3" }; CacheHelper.SetMultiple(k6, a6); Response.Write("下面是 泛型 批量 獲取對象<br/>"); List<A> list = CacheHelper.GetMultipleList<A>(k6); foreach (A p in list) { Response.Write(p.Name + "<br/>"); } } } }
第 5步: 測試指定服務器
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace www.memcached.com { public partial class Test4 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { CacheHelper.SetTo("Svr1", "Abc", "good1"); CacheHelper.SetTo("Svr2", "Abc", "good2"); Response.Write("第一台服務器:"+CacheHelper.GetFrom("Svr1", "Abc")+"<br/>"); Response.Write("第二台服務器:" + CacheHelper.GetFrom("Svr2", "Abc") + "<br/>"); CacheHelper.StoreCounterTo("Svr1","Count",1); CacheHelper.IncrementTo("Svr1", "Count", 10); Response.Write("自增結果:" + CacheHelper.GetCounterFrom("Svr1", "Count") + "<br/>"); } } }
第 6步: 項目配置文件
<?xml version="1.0"?> <!-- 有關如何配置 ASP.NET 應用程序的詳細信息,請訪問 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <appSettings> <add key="Svr1" value="127.0.0.1:12345"/> <add key="Svr2" value="192.168.1.26:11211"/> </appSettings> <system.web> <compilation debug="true" targetFramework="4.0" /> <authentication mode="Forms"> <forms loginUrl="~/Account/Login.aspx" timeout="2880" /> </authentication> <membership> <providers> <clear/> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> </providers> </membership> <profile> <providers> <clear/> <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> </providers> </profile> <roleManager enabled="false"> <providers> <clear/> <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> </providers> </roleManager> </system.web> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration>
下面給出項目源碼 下載地址 http://files.cnblogs.com/HCCZX/www.memcached.com.rar
