• 关于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  创作

     

    再牛逼的梦想,也抵不住我傻逼似的坚持!别在该奋斗的年纪,贪图安逸。 今天多学一些知识,明天开发的速度就更快一下。后天你就会变得更好。
  • 相关阅读:
    [leetcode-495-Teemo Attacking]
    [leetcode-413-Arithmetic Slices]
    document对象操作:浏览器页面文件
    搭建wamp环境,数据库基础知识
    jenkins配置邮箱服务器(126邮箱)
    Linux命令之文件与用户权限
    并发与同步、信号量与管程、生产者消费者问题
    TypeScript设计模式之职责链、状态
    了解HTML列表
    CSS画出的图
  • 原文地址:https://www.cnblogs.com/LowKeyCXY/p/9031310.html
Copyright © 2020-2023  润新知