關於Memcached 你瞭解多少?

很久沒有寫博客了,自從年後到如今要麼就是加班 要麼仍是在加班 基本都是到夜裏1點多 通宵的幹,事情太多,項目太急  。可貴今天閒暇一段時間來,看看書,寫一寫博客,沒事就再從新的研究一下關於Memcached 的使用。算法

一.關於Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提升動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的HashMap。其中的守護進程(daemon )是用經過C語言進行編寫,可是客戶端能夠用任何語言來編寫,並經過memcached協議與守護進程通訊。好比.NET JAVA  PHP  Python  等開發語言都是能夠進行結合到Memcached  進行使用的。其中Memcached  存儲的原理是基於Key-Value 的形式進行保存到緩存裏面的。
數據庫

二.關於如何安裝 Memcached  在Windows 或者LINUX  我就不一一的就進行介紹了,下面我主要介紹如何進行使用Memcached  我我的主要是使用.NET  C Sharp  進行開發的,因此下面我就演示一下如何使用C Sharp 如何來進行作緩存的處理。緩存

三.咱們須要首先創建一個項目我這邊按照控制檯應用程序爲例,進行管理NuGet 添加 Memcached.Client 程序集  ISharpCode.SharpZipLib.dll  和Log4net 這些程序集。下面你就能夠進行操做和使用這3個程序集裏面內部封裝的東西了。服務器

四.我我的比較喜歡就行將內部的方法進行從新封裝進行重寫 這樣會更加的方便個人使用。分佈式

1.Memcached 緩存處理類ide

using System;
/****************************************************
@做者:LowKeyC
@說明: Memcached 緩存處理類
@版本號:V1.0
@建立日期:2018年5月25日
*****************************************************/
namespace Memcached.Lib
{
     /// <summary>
     /// 緩存處理類
     /// </summary>
    public static class CacheHelper
    {
        #region 緩存供給者對象 +static ICacheProvider CacheProvider
        private static ICacheProvider _cacheProvider;
        /// <summary>
        /// 緩存供給者對象
        /// </summary>
        public static ICacheProvider CacheProvider
        {
            get
            {
                if (_cacheProvider != null)
                    return _cacheProvider;
                lock ("CacheProvider")
                {
                    if (_cacheProvider != null)
                        return _cacheProvider;
                    return (_cacheProvider = new MemcachedProvider());
                }
            }
        } 
        #endregion

        #region 獲取緩存數據 +static object Get(string key)
        public static object Get(string key)
        {
            return CacheProvider.Get(key);
        }
        #endregion

        #region 獲取緩存數據 +static T Get<T>(string key) where T : class
        public static T Get<T>(string key) where T : class
        {
            return CacheProvider.Get<T>(key);
        }
        #endregion

        #region 設置數據緩存 +static void Set(string key, object value, DateTime absoluteExpiration)
        /// <summary>
        /// 設置數據緩存
        /// </summary>
        /// <param name="key">鍵</param>
        /// <param name="value">緩存對象</param>
        /// <param name="absoluteExpiration">絕對過時時間</param>
        public static void Set(string key, object value, DateTime absoluteExpiration)
        {
            CacheProvider.Set(key, value, absoluteExpiration);
        }
        #endregion

        #region 設置數據緩存 +static void Set(string key, object value, TimeSpan slidingExpiration)
        /// <summary>
        /// 設置數據緩存
        /// </summary>
        /// <param name="key">鍵</param>
        /// <param name="value">緩存對象</param>
        /// <param name="slidingExpiration">最後一次訪問所插入對象時與該對象到期時之間的時間間隔</param>
        public static void Set(string key, object value, TimeSpan slidingExpiration)
        {
            CacheProvider.Set(key, value, slidingExpiration);
        }
        #endregion

        #region 移除指定鍵的緩存數據 +static void Remove(string key)
        /// <summary>
        /// 移除指定鍵的緩存數據
        /// </summary>
        /// <param name="key">鍵</param>
        public static void Remove(string key)
        {
            CacheProvider.Remove(key);
        }
        #endregion

        #region 清除所有緩存數據 +static void Clear()
        /// <summary>
        /// 清除所有緩存數據
        /// </summary>
        /// <remarks>
        /// </remarks>
        public static void Clear()
        {
            CacheProvider.Clear();
        }
        #endregion

        #region static void Clear(string pattern)
        /// <summary>
        /// 清除通配鍵的緩存數據
        /// </summary>
        /// <param name="pattern">鍵</param>
        public static void Clear(string pattern)
        {
            CacheProvider.Clear(pattern);
        }
        #endregion
         
    }
}

 2.基於HttpRuntime的緩存供給者     memcached

using System;
using System.Text.RegularExpressions;
using System.Web;
/****************************************************
@做者:LowKeyC
@說明: 基於HttpRuntime的緩存供給者
@版本號:V1.0
@建立日期:2018年5月25日
*****************************************************/
namespace Memcached.Lib
{
    /// <summary>
    /// 基於HttpRuntime的緩存供給者
    /// </summary>
    public class DefaultCacheProvider : ICacheProvider
    {
        #region 獲取緩存數據 +object Get(string key)
        /// <summary>
        /// 獲取緩存數據
        /// </summary>
        /// <param name="key">鍵</param>
        /// <returns>System.Object.</returns>
        public object Get(string key)
        {
            var cache = HttpRuntime.Cache;
            return cache[key];
        }
        #endregion

        #region 獲取緩存數據 +T Get<T>(string key) where T : class
        /// <summary>
        /// 獲取緩存數據
        /// </summary>
        /// <typeparam name="T">數據類型</typeparam>
        /// <param name="key">鍵</param>
        /// <returns>指定數據類型的對象</returns>
        public T Get<T>(string key) where T : class
        {
            var obj = Get(key);
            return obj as T;
        }
        #endregion

        #region 設置數據緩存 +void Set(string key, object value, DateTime absoluteExpiration)
        /// <summary>
        /// 設置數據緩存
        /// </summary>
        /// <param name="key">鍵</param>
        /// <param name="value">緩存對象</param>
        /// <param name="absoluteExpiration">絕對過時時間</param>
        public void Set(string key, object value, DateTime absoluteExpiration)
        {
            var cache = HttpRuntime.Cache;
            cache.Insert(key, value, null, absoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration);//TimeSpan.Zero);
        }
        #endregion

        #region 設置數據緩存 +void Set(string key, object value, TimeSpan slidingExpiration)
        /// <summary>
        /// 設置數據緩存
        /// </summary>
        /// <param name="key">鍵</param>
        /// <param name="value">緩存對象</param>
        /// <param name="slidingExpiration">最後一次訪問所插入對象時與該對象到期時之間的時間間隔</param>
        public void Set(string key, object value, TimeSpan slidingExpiration)
        {
            var cache = HttpRuntime.Cache;
            cache.Insert(key, value, null, DateTime.MaxValue, slidingExpiration);
        }
        #endregion

        #region 移除指定鍵的緩存數據 +void Remove(string key)
        /// <summary>
        /// 移除指定鍵的緩存數據
        /// </summary>
        /// <param name="key">鍵</param>
        public void Remove(string key)
        {
            var cache = HttpRuntime.Cache;
            cache.Remove(key);
        }
        #endregion

        #region 清除所有緩存數據 +void Clear()
        /// <summary>
        /// 清除所有緩存數據
        /// </summary>
        public void Clear()
        {
            var cache = HttpRuntime.Cache;
            var cacheEnum = cache.GetEnumerator();
            while (cacheEnum.MoveNext())
            {
                cache.Remove(cacheEnum.Key.ToString());
            }
        }
        #endregion

        #region 清除通配鍵的緩存數據 +void Clear(string pattern)
        /// <summary>
        /// 清除通配鍵的緩存數據
        /// </summary>
        /// <param name="pattern">鍵</param>
        public void Clear(string pattern)
        {
            var cache = HttpRuntime.Cache;
            var cacheEnum = cache.GetEnumerator();
            while (cacheEnum.MoveNext())
            {
                var key = cacheEnum.Key.ToString();
                if (Regex.IsMatch(key, pattern))
                    cache.Remove(key);
            }
        }
        #endregion

        public void Dispose()
        {
            
        }
    }
}

 3.緩存供給者約束接口性能

using System;
/****************************************************
@做者:LowKeyC
@說明: 緩存供給者約束接口
@版本號:V1.0
@建立日期:2018年5月25日
*****************************************************/
namespace Memcached.Lib
{
    /// <summary>
    /// 緩存供給者約束接口
    /// </summary>
    public interface ICacheProvider : IDisposable
    {
        #region 獲取緩存數據 +object Get(string key)
        /// <summary>
        /// 獲取緩存數據
        /// </summary>
        /// <remarks>
        ///  2013-11-23 22:03 Created By iceStone
        /// </remarks>
        /// <param name="key">鍵</param>
        /// <returns>System.Object.</returns>
        object Get(string key);
        #endregion

        #region 獲取緩存數據 +T Get<T>(string key) where T : class
        /// <summary>
        /// 獲取緩存數據
        /// </summary>
        /// <typeparam name="T">數據類型</typeparam>
        /// <param name="key">鍵</param>
        /// <returns>指定數據類型的對象</returns>
        T Get<T>(string key) where T : class;
        #endregion

        #region 設置數據緩存 +void Set(string key, object value, DateTime absoluteExpiration)
        /// <summary>
        /// 設置數據緩存
        /// </summary>
        /// <param name="key">鍵</param>
        /// <param name="value">緩存對象</param>
        /// <param name="absoluteExpiration">絕對過時時間</param>
        void Set(string key, object value, DateTime absoluteExpiration);
        #endregion

        #region 設置數據緩存 +void Set(string key, object value, TimeSpan slidingExpiration)
        /// <summary>
        /// 設置數據緩存
        /// </summary>
        /// <param name="key">鍵</param>
        /// <param name="value">緩存對象</param>
        /// <param name="slidingExpiration">最後一次訪問所插入對象時與該對象到期時之間的時間間隔</param>
        void Set(string key, object value, TimeSpan slidingExpiration);
        #endregion

        #region 移除指定鍵的緩存數據 +void Remove(string key)
        /// <summary>
        /// 移除指定鍵的緩存數據
        /// </summary>
        /// <param name="key">鍵</param>
        void Remove(string key);
        #endregion

        #region 清除所有緩存數據 +void Clear()
        /// <summary>
        /// 清除所有緩存數據
        /// </summary>
        void Clear();
        #endregion

        #region 清除通配鍵的緩存數據 +void Clear(string pattern)
        /// <summary>
        /// 清除通配鍵的緩存數據
        /// </summary>
        /// <param name="pattern">鍵</param>
        void Clear(string pattern);
        #endregion
    }
}

 4. 而後在進行具體使用的地方進行調用便可,緩存操做助手類。     網站

using System;
using System.Collections.Generic;
using System.Text;
using Memcached.Client;
/****************************************************
@做者:LowKeyC
@說明: 緩存操做助手類
@版本號:V1.0
@建立日期:2018年5月25日
*****************************************************/
namespace Memcached.Lib
{
    /// <summary>
    /// 緩存操做助手類
    /// </summary>
    public class MemcachedProvider : ICacheProvider
    {
        static MemcachedClient client;
        static SockIOPool pool;
        static MemcachedProvider()
        {
            //建立鏈接池對象
            pool = SockIOPool.GetInstance("xxx");

            #region 設置鏈接池各項經常使用參數
            //設置緩存服務地址
            pool.SetServers(new[] { "IP+端口" });
            //設置鏈接池初始數目、最小鏈接數目和鏈接數目
            pool.InitConnections = 3;
            pool.MinConnections = 3;
            pool.MaxConnections = 50;
            //設置Socket鏈接超時時間、Socket鏈接超時時間
            pool.SocketConnectTimeout = 1000;
            pool.SocketTimeout = 3000;
            //設置維護線程運行的睡眠時間。若是設置爲0,那麼維護線程將不會啓動
            pool.MaintenanceSleep = 30;
            //若是設置爲false,則獲得一個套接字若是存在的話。不然返回NULL,若是它沒法鏈接到請求的服務器。
            pool.Failover = true;
            //若是爲false,對全部建立的套接字關閉Nagle的算法
            pool.Nagle = false;
            #endregion

            //初始化鏈接池
            pool.Initialize();

            client = new MemcachedClient();
            client.EnableCompression = true; //是否啓用壓縮數據
            client.PoolName = "micua";//此處須要與鏈接池名稱相同,注意!!!
        }
        public object Get(string key)
        {
            var cache = client.Get(key) as _CacheItem;
            if (cache == null) return null;
            if (cache.SlidingExpiration != TimeSpan.Zero)
                client.Set(key, cache, DateTime.Now.Add(cache.SlidingExpiration));
            return cache.Data;
        }

        public T Get<T>(string key) where T : class
        {
            return Get(key) as T;
        }

        public void Set(string key, object value, DateTime absoluteExpiration)
        {
            var cache = new _CacheItem { Data = value, SlidingExpiration = TimeSpan.Zero };
            client.Set(key, cache, absoluteExpiration);
        }

        public void Set(string key, object value, TimeSpan slidingExpiration)
        {
            var cache = new _CacheItem { Data = value, SlidingExpiration = slidingExpiration };
            client.Set(key, cache, DateTime.Now.Add(slidingExpiration));
        }

        public void Remove(string key)
        {
            client.Delete(key);
        }

        public void Clear()
        {
            client.FlushAll();
        }

        public void Clear(string pattern)
        {
            client.FlushAll();
        }

        public void Dispose()
        {
            pool.Shutdown();
        }
    }
    [Serializable]
    class _CacheItem
    {
        public object Data { get; set; }
        public TimeSpan SlidingExpiration { get; set; }
    }
}

                                                              以上內容基本都是原創,部分引用了維基百科,和其餘博客的觀點。 spa

                                                                         2018/05/13    01:23:13  創做

相關文章
相關標籤/搜索