C#實現Memcached分布式緩存,指定服務器保存變量


說明: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

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM