全面解析windows下Memcache技術應用


 

一、Memcache介紹

      Memcache 是 danga.com 的一個項目,最早是為 LiveJournal 服務的,目前全世界不少人使用這個緩存項目來構建自己大負載的網站,來分擔數據庫的壓力。它可以應對任意多個連接,使用非阻塞的網絡 IO 。由於它的工作機制是在內存中開辟一塊空間,然后建立一個 HashTable , Memcached 自管理這些 HashTable 。Memcache是高性能的分布式內存緩存服務器。一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴展性。Memcache 官方網站: http://www.danga.com/memcached。

二、Memcache安裝

       安裝包里面會有x64和x86兩個文件夾,根據操作系統選擇一個打開會找到memcached.exe。這個文件不能直接雙擊運行安裝,需要通過cmd進行安裝。

 

    cmd命令:Memcache –d start|stop|shutdown|restart|uninstall|install 啟動|停止|關閉|重啟|卸載|安裝。

     安裝步驟:1.找到文件memcache.exe路徑;

                   2.memcache –d install安裝完畢;

 

                   3.啟動服務后windows進程中可以看到memcache.exe;

                  4.服務器安裝完成后,我們可以通過telnet到服務器測試一下(如果提示telnet命令不存在,需要去控制面板開啟windows的telnet服務功能) 例如:                       10.0.27.120是安裝memcache服務的ip地址,11211是默認的端口。輸入stats查看參數信息。

到此memcache的安裝全部完成。

三、Memcache在程序中的應用

     在解決方案中新建memcache的類庫,引用以下幾個類庫,Commons.dll,Memcached.ClientLibrary.dll,ICSharpCode.SharpZipLib.dll。新建MemcacheHelper.cs這個memcache的使用類。准備工作做完之后開始進入memcache的使用。

1.在web.config里面配置memcache的服務器地址

<appSettings>

<!--memcache的服務器配置,IP地址后期再改,端口號固定為11211-->
<add key="Memcached.ServerList" value="10.3.2.24:11211"/>

<appSettings>

2.在MemcacheHelper.cs類里面編寫實現代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Memcached.ClientLibrary;
using System.Data;
using System.Configuration;
using NLP.Common;


namespace NLP.Memcache
{
    public class MemcacheHelper
    {
        #region 全局靜態對象
        // 全局Socket連接池對象
        private static SockIOPool sockIOPool;
        public static SockIOPool CurrentPool
        {
            get
            {
                return sockIOPool;
            }
        }
        // 全局Memcached客戶端對象
        private static MemcachedClient mc;
        #endregion



        public static bool MemcacheHelperInit()
        {
            try
            {
                // 初始化Memcached服務器列表
                string[] serverList = ConfigurationManager.AppSettings["Memcached.ServerList"].Split(',');
                // 初始化Socket連接池
                sockIOPool = SockIOPool.GetInstance("MemPool");
                sockIOPool.SetServers(serverList);
                sockIOPool.Initialize();
                // 初始化Memcached客戶端
                mc = new MemcachedClient();
                mc.PoolName = "MemPool";
                mc.EnableCompression = false;
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// 判斷pkey關鍵字是否在Pmc中
        /// </summary>
        /// <param name="pMC"></param>
        /// <param name="pKey"></param>
        /// <returns></returns>
        public static bool IsCache(string pKey)
        {
            if (MemcacheHelperInit())
            {
                if (mc.KeyExists(pKey))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 刪掉Memcache 數據
        /// </summary>
        /// <param name="key"> </param>
        /// <returns></returns>
        public static bool RemoveCache(string pKey)
        {
            if (MemcacheHelperInit())
            {
                if (!mc.KeyExists(pKey))
                {
                    return false;
                }
                else
                {
                    return mc.Delete(pKey);
                }
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Set-新增或修改
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns>是否成功</returns>
        public static bool AddCache(string key, object value)
        {
            if (MemcacheHelperInit())
            {
                if (!mc.KeyExists(key))
                {
                    return mc.Add(key, value);
                }
                else
                {
                    return mc.Set(key, value);
                }
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Set-新增或修改
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <param name="expiry">過期時間</param>
        /// <returns>是否成功</returns>
        public static bool AddCache(string key, object value, DateTime expiry)
        {
            if (MemcacheHelperInit())
            {
                if (!mc.KeyExists(key))
                {
                    return mc.Add(key, value, expiry);
                }
                else
                {
                    return mc.Set(key, value, expiry);
                }
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 根據單個key值獲取Memcache 數據
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static object GetCache(string key)
        {
            if (MemcacheHelperInit())
            {
                if (!mc.KeyExists(key))
                {
                    return null;
                }
                else
                {
                    return mc.Get(key);
                }
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 根據多個key值獲取Memcache 數據
        /// </summary>
        /// <param name="key"> </param>
        /// <returns></returns>
        public static Dictionary<string, object> GetCache(string[] keys)
        {
            Dictionary<string, object> dic = new Dictionary<string, object>();
            if (MemcacheHelperInit())
            {
                foreach (string key in keys)
                {
                    object obj = mc.Get(key);
                    if (!dic.ContainsKey(key) && obj != null)
                        dic.Add(key, obj);
                }
                return dic;
            }
            else
            {
                return null;
            }
        }
    }
}
View Code

3.在調用代碼里面調用MemcacheHelper.cs的memcache方法

如bool result=MemcacheHelper.AddCache("User","123456");//實現新增key位User,value值為123456的memcache

//獲取memcache中value值,為json格式
string ob_json = MemcacheHelper.GetCache("User").ToString();

這樣就實現了memcache的新增、查詢的完整應用。


免責聲明!

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



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