zoukankan      html  css  js  c++  java
  • 关于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 缓存处理类

    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的缓存供给者     

    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; }
        }
    }

                                                                  以上内容基本都是原创,部分引用了维基百科,和其他博客的观点。 

                                                                             2018/05/13    01:23:13  创作

     

    再牛逼的梦想,也抵不住我傻逼似的坚持!别在该奋斗的年纪,贪图安逸。 今天多学一些知识,明天开发的速度就更快一下。后天你就会变得更好。
  • 相关阅读:
    SCAU 9504 面试
    SCAU 9503 懒人选座位
    SCAU 8628 相亲
    SCAU 10691 ACM 光环
    SCAU 8626 原子量计数
    SCAU 10674 等差对
    HDU ACM 1048 The Hardest Problem Ever (水题)
    SCAU 9502 ARDF
    SCAU 10686 DeathGod不知道的事情
    SCAU 8629 热身游戏(高精度)
  • 原文地址:https://www.cnblogs.com/LowKeyCXY/p/9031310.html
Copyright © 2011-2022 走看看