关于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 缓存处理类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | 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的缓存供给者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | 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.缓存供给者约束接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | 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. 然后在进行具体使用的地方进行调用即可,缓存操作助手类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | 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 创作
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2017-05-13 JS 特殊字符的验证的问题