asp.net mvc3.0 集成memcached

     
        memcached 的強大,不用說了!我這裏對它的應用也只是冰山一角。都是些基本運用.

       可以先從  memcached官方 下載 。最新版本應該是1.4.15。我這裏下載的是windows穩定版 版本是1.4.14.

        下載下來後.直接解壓然後將memcached裏面文件拷貝到你想創建的目錄下即可

           

       

        

    然後dos下安裝一下就OK了!至於一些基本參數可以再dos中設置,也可以再項目中設置,比如最大連接數,最小連接數,超時時間等等.(我的虛擬機又不工作了!FK.具體參數設置就不說了!)。參數信息可以參考一下下面我在網上找的一個列表.


         -p 監聽的端口


         -l 連接的IP地址, 默認是本機


         -d start 啓動memcached服務


         -d restart 重起memcached服務


         -d stop|shutdown 關閉正在運行的memcached服務


         -d install 安裝memcached服務


         -d uninstall 卸載memcached服務


         -u 以的身份運行 (僅在以root運行的時候有效)


         -m 最大內存使用,單位MB。默認64MB


         -M 內存耗盡時返回錯誤,而不是刪除項


         -c 最大同時連接數,默認是1024


         -f 塊大小增長因子,默認是1.25


         -n 最小分配空間,key+value+flags默認是48


         -h 顯示幫助


         mvc3.0項目搭建好後,會自動生成Global.asax文件,項目的一個全局文件! 我們在這裏面設置memcached 的啓動參數!


        

        public static void cachePool()
        {
            string poolname = "default";
            String[] serverlist = { "127.0.0.1:11211" };          ->這裏如果需要部署分佈式, 繼續在後面追加ip即可!例如String[] serverlist = { "192.168.1.1:11211","192.168.1.2:11211" };
            SockIOPool pool = SockIOPool.GetInstance(poolname);
            pool.SetServers(serverlist); //設置服務器列表
            //各服務器之間負載均衡的設置
            pool.SetWeights(new int[] { 1 });                  ->這裏部署分佈式的時候是個很重要的參數,  相當於設置cache 值的主次!
            //socket pool設置
            pool.InitConnections = 5; //初始化時創建的連接數
            pool.MinConnections = 5; //最小連接數
            pool.MaxConnections = 2000; //最大連接數

            //連接的最大空閒時間,下面設置爲6個小時(單位ms),超過這個設置時間,連接會被釋放掉
            pool.MaxIdle = 1000 * 60 * 60 * 6;
            //通訊的超時時間,下面設置爲3秒(單位ms),.NET版本沒有實現
            pool.SocketTimeout = 1000 * 3;
            //socket連接的超時時間,下面設置表示連接不超時,即一直保持連接狀態
            pool.SocketConnectTimeout = 0;
            pool.Nagle = false; //是否對TCP/IP通訊使用Nalgle算法,.NET版本沒有實現
            //維護線程的間隔激活時間,下面設置爲60秒(單位s),設置爲0表示不啓用維護線程
            pool.MaintenanceSleep = 60;
            //socket單次任務的最大時間,超過這個時間socket會被強行中斷掉(當前任務失敗)
            pool.MaxBusy = 1000 * 10;

            pool.Failover = true;

            pool.Initialize();
        }
        protected void Application_Start()      //這裏調用
        {             
            cachePool();
        }
            

                OK,基本設置已經完成,下一步 我們需要下載兩個dll 。用於集成net。 一個是Memcached.ClientLibrary 還有 MemcachedProviders.然後引用一下!

               

                 接下來我們寫一個cache的操作類DataCache

                 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using Memcached.ClientLibrary;
using System.Security.Cryptography;

namespace Common
{
    /// <summary>
    /// memcached 緩存操作類
    /// </summary>
     public class DataCache
    {
        public static void SetMc(object obj, string cacheName)
        {
            string poolname = "default";
            cacheName = GetMD5(cacheName); 
            //客戶端實例
            MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
            mc.PoolName = poolname; //如果實例化pool時沒有poolname,該行可以不用。
            mc.EnableCompression = true;
            mc.CompressionThreshold = 10240;
            if (obj != null)
                mc.Set(cacheName, obj, DateTime.Now.AddHours(3));
        }
        public static void SetMc(object obj, string cacheName, int minutes)
        {
            string poolname = "default";
            cacheName = GetMD5(cacheName);
            //客戶端實例
            MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
            mc.PoolName = poolname; //如果實例化pool時沒有poolname,該行可以不用。
            mc.CompressionThreshold = 10240;
            if (obj != null)
                mc.Set(cacheName, obj, DateTime.Now.AddMinutes(minutes));
        }
        public static object GetMc(string cacheName)
        {
            string poolname = "default";
            cacheName = GetMD5(cacheName);
            //客戶端實例
            MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
            mc.PoolName = poolname; //如果實例化pool時沒有poolname,該行可以不用。
            mc.EnableCompression = true;
            return (object)mc.Get(cacheName);

        }
        public static void UpdateMc(object obj, string cacheName)
        {
            string poolname = "default";
            cacheName = GetMD5(cacheName);
            //客戶端實例
            MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
            mc.PoolName = poolname; //如果實例化pool時沒有poolname,該行可以不用。
            mc.Delete(cacheName);
            if (obj != null)
            {
                mc.EnableCompression = true;
                mc.Set(cacheName, obj);
            }
        }
        public static void DelMc(string cacheName)
        {
            string poolname = "default";
            cacheName = GetMD5(cacheName);
            //客戶端實例
            MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
            mc.PoolName = poolname; //如果實例化pool時沒有poolname,該行可以不用。
            mc.Delete(cacheName);
        }
         /// <summary>
         /// Cache MD5
         /// </summary>
         /// <param name="str"></param>
         /// <returns></returns>
        public static string GetMD5(string str)
        {
            int size = Common.PageBase.memcachedMD5Size;
            if (size == 16)
            {//16位
                MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                str = BitConverter.ToString(md5.ComputeHash(System.Text.UTF8Encoding.Default.GetBytes(str)), 4, 8);
                str = str.Replace("-", "");
            }
            else
            {  //32位
                byte[] b = System.Text.Encoding.Default.GetBytes(str);
                b = new MD5CryptoServiceProvider().ComputeHash(b);
                for (int i = 0; i < b.Length; i++)
                {
                    str += b[i].ToString("x").PadLeft(2, '0');
                }
            }
            return str;
        }
    }
}

                    OK. 可以看到這兩個參數。是設置memcached緩存的壓縮比。memcached的單個item最多存儲1m數據。 
            mc.EnableCompression = true;

                    至於cache  key 用md5加密,有兩個原因,1是因爲memcached 對於key的長度也是有限制,如果超出限制長度當前這個item會一直處於失效狀態,2是因爲安全問題。

                      

                    基本設置都已經完成,接下來可以使用我們的DataCache 進行數據緩存了。


                   

        /// <summary>
        /// get Model  by code
        /// </summary>
        /// <param name="OrderCode"></param>
        /// <returns></returns>
        public OrderInfo OrderInfoModelByOrderCode(string OrderCode)
        {
            string cacheKey = "OrderInfoModelByOrderCode_" + OrderCode;
            object objModel = Common.DataCache.GetMc(cacheKey);
            if (objModel == null)
            {
                try
                {
                    OrderInfo orderModel = dal.OrderInfoModelByOrderCode(OrderCode);
                    objModel = orderModel;
                    if (objModel != null)
                    {
                        int cacheTime = Common.PageBase.memcachedTime;            //memcached自動超時時間,比如設置10.當前這個cache item 就會在10分鐘後自動失效,如有新請求,則重新add
                        Common.DataCache.SetMc(objModel, cacheKey, cacheTime);
                    }
                }
                catch (Exception ex)
                {

                }
            }
            return (OrderInfo)objModel;
        }


       到這裏,基本運用就完成了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章