Asp.Net Core2.0下使用memcached缓存。

Memcached目前微软暂未支持,暂只支持Redis,由于项目历史原因,先用博客园开源项目EnyimMemcachedCore,后续用到的时候在详细完善测试。

MemcachedHelper此类待完善,仅供参考,注释掉66和179行可用。net core下替代HttpContext.Current.Application.Lock()方法暂未找到。
  1 public class MemcachedHelper
2 {
3 private static string _DEPEND_ = "mcache_default_depend";
4 private static string _DICT_CACHE_ = "default_core_depend_dictiaonry";
5 private static int _EXP_ = 10 * 60; //默认缓存10分钟
6 private static int HH = 3600; //1小时=3600秒
7
8 static readonly object mlock = new object();
9 private static readonly ILoggerFactory _loggerFacotry = new LoggerFactory();
10 /// <summary>
11 /// 定义一个静态MemcachedClient客户端,它随类一起加载,所有对象共用
12 /// </summary>
13 private static MemcachedClient mclient;
14 /// <summary>
15 /// 构造函数,连接memcachedcore并为KEYS字典开辟储存空间
16 /// </summary>
17 static MemcachedHelper()
18 {
19 //mclient = MemCached.getInstance();
20 if (mclient == null)
21 {
22 lock (mlock)
23 {
24 if (mclient == null)
25 {
26 var options = new MemcachedClientOptions();
27 UtilConf.Configuration.GetSection("enyimMemcached").Bind(options);
28 mclient = new MemcachedClient(_loggerFacotry, new MemcachedClientConfiguration(_loggerFacotry, options));
29 }
30 }
31 }
32 //在缓存中开辟一个专门用来存储Kyes的字典对象
33 MDictionary_SaveDict(new Dictionary<string, List<string>>());
34 }
35
36 #region ** 获取缓存 **
37 /// <summary>
38 /// 获取缓存
39 /// </summary>
40 public static object Get(string key)
41 {
42 key = key.ToLower();
43 return mclient.Get(key);
44 }
45 #endregion
46
47 #region ** 添加缓存 **
48 /// <summary>
49 /// 添加单个依赖项的缓存 (最小时间单位为秒)
50 /// </summary>
51 public static void Set(string depend, string key, object obj, int exp)
52 {
53 depend = depend.ToLower();
54 key = key.ToLower();
55
56 try
57 {
58 //HttpContext.Current.Application.Lock();
59
60 //将数据加入缓存
61 mclient.Add(key, obj, exp);
62
63 //HttpContext.Current.Application.UnLock();
64
65 ////将Keys加入字典
66 //MDictionary_AddKeys(depend, key);
67 }
68 catch (System.Exception ex)
69 {
70 throw new Exception(ex.Message);
71 }
72 }
73
74 #region ++ Set的多种实现方式
75 /// <summary>
76 /// 默认时间
77 /// </summary>
78 public static void Set(string depend, string key, object obj)
79 {
80 MemcachedHelper.Set(depend, key, obj, _EXP_);
81 }
82 /// <summary>
83 /// 默认Depend和时间
84 /// </summary>
85 public static void Set(string key, object obj)
86 {
87 MemcachedHelper.Set(_DEPEND_, key, obj, _EXP_);
88 }
89 /// <summary>
90 /// 默认Depend
91 /// </summary>
92 public static void Set(string key, object obj, int exp)
93 {
94 MemcachedHelper.Set(_DEPEND_, key, obj, exp);
95 }
96 /// <summary>
97 /// 长时间缓存
98 /// </summary>
99 public static void SetLong(string depend, string key, object obj)
100 {
101 int t = 31536000; //1年 = 10 * 365 * 24 * 60 * 60;
102 MemcachedHelper.Set(depend, key, obj, t);
103 }
104 /// <summary>
105 /// 长时间默认depend
106 /// </summary>
107 public static void SetLong(string key, object obj)
108 {
109 int t = 31536000; //365 * 24 * 60 * 60; //1年
110 MemcachedHelper.Set(_DEPEND_, key, obj, t);
111 }
112 public static void SetAllLong(string key, object obj)
113 {
114 int t = 315360000; //365 * 24 * 60; //10年
115 MemcachedHelper.Set(_DEPEND_, key, obj, t);
116 }
117 #endregion
118
119 #endregion
120
121 #region ** 删除缓存 **
122 /// <summary>
123 /// 删除有依赖项的Keys的缓存
124 /// </summary>
125 public static void RemoveKeys(string depend, string key)
126 {
127 depend = depend.ToLower();
128 key = key.ToLower();
129
130 try
131 {
132 //HttpContext.Current.Application.Lock();
133
134 //删除缓存
135 mclient.Remove(key);
136
137 //删除key
138 MDictionary_RemoveKeys(depend, key);
139
140 //HttpContext.Current.Application.UnLock();
141
142 }
143 catch (System.Exception ex)
144 {
145 throw new Exception(ex.Message);
146 }
147 }
148
149 /// <summary>
150 /// 删除默认depend的缓存
151 /// </summary>
152 public static void RemoveKeys(string key)
153 {
154 RemoveKeys(_DEPEND_, key);
155 }
156
157 /// <summary>
158 /// 删除整个依赖项
159 /// </summary>
160 public static void RemoveDepend(string depend)
161 {
162 depend = depend.ToLower();
163
164 try
165 {
166 //获取keys列表
167 List<string> keysList = MDictionary_GetKeys(depend);
168
169 //循环删除数据
170 for (int i = 0; i < keysList.Count; i++)
171 {
172 string k = keysList[i];
173 //清空缓存Key
174 mclient.Remove(k);
175 ////清空字典下的Key
176 //MDictionary.RemoveKeys(depend, k);
177 }
178 ////清空字典
179 //MDictionary_RemoveDepend(depend);
180
181 }
182 catch (System.Exception ex)
183 {
184 throw new Exception(ex.Message);
185 }
186 }
187 #endregion
188
189 #region --字典管理--
190
191 #region ** 字典存取 **
192 /// <summary>
193 /// 取出字典
194 /// </summary>
195 public static Dictionary<string, List<string>> MDictionary_GetDict()
196 {
197 Dictionary<string, List<string>> dict = mclient.Get(_DICT_CACHE_) as Dictionary<string, List<string>>;
198 if (dict == null)
199 {
200 Dictionary<string, List<string>> newDict = new Dictionary<string, List<string>>();
201 MDictionary_SaveDict(newDict);
202 return newDict;
203 }
204 else
205 {
206 return dict;
207 }
208 }
209
210 /// <summary>
211 /// 存入字典
212 /// </summary>
213 public static void MDictionary_SaveDict(Dictionary<string, List<string>> dict)
214 {
215 //默认保存360天
216 mclient.Add(_DICT_CACHE_, dict, HH * 24 * 360);
217 }
218
219 /// <summary>
220 /// 添加并存入
221 /// </summary>
222 public static void MDictionary_AddToDictAndSave(string depend, List<string> listKeys)
223 {
224 //取出字典
225 Dictionary<string, List<string>> dict = MDictionary_GetDict();
226
227 //修改或新增字典
228 if (dict.ContainsKey(depend))
229 {
230 dict[depend] = listKeys; //覆盖
231 }
232 else
233 {
234 dict.Add(depend, listKeys); //新添加
235 }
236
237 //存回
238 MDictionary_SaveDict(dict);
239 }
240 #endregion
241
242 #region ** keys操作 **
243 /// <summary>
244 /// 根据depend获取Keys列表
245 /// </summary>
246 public static List<string> MDictionary_GetKeys(string depend)
247 {
248 depend = depend.ToLower();
249
250 Dictionary<string, List<string>> dict = MDictionary_GetDict();
251 if (dict.ContainsKey(depend))
252 {
253 return dict[depend];
254 }
255 return new List<string>();
256 }
257
258 /// <summary>
259 /// 添加keys到字典
260 /// </summary>
261 public static void MDictionary_AddKeys(string depend, string key)
262 {
263 depend = depend.ToLower();
264 key = key.ToLower();
265
266 //添加keys列表
267 List<string> listKeys = MDictionary_GetKeys(depend);
268 if (!listKeys.Contains(key))
269 {
270 listKeys.Add(key);
271 //添加并存回字典
272 MDictionary_AddToDictAndSave(depend, listKeys);
273 }
274
275 }
276
277 /// <summary>
278 /// 从字典中删除一个Key
279 /// </summary>
280 public static void MDictionary_RemoveKeys(string depend, string key)
281 {
282 depend = depend.ToLower();
283 key = key.ToLower();
284
285 List<string> listKeys = MDictionary_GetKeys(depend);
286 if (listKeys.Contains(key))
287 {
288 listKeys.Remove(key);
289 //添加并存回字典
290 MDictionary_AddToDictAndSave(depend, listKeys);
291 }
292 }
293
294 /// <summary>
295 /// 删除depend下所有的keys列表
296 /// </summary>
297 public static void MDictionary_RemoveDepend(string depend)
298 {
299 depend = depend.ToLower();
300
301 Dictionary<string, List<string>> dict = MDictionary_GetDict();
302 if (dict.ContainsKey(depend))
303 {
304 dict.Remove(depend);
305 //存回
306 MDictionary_SaveDict(dict);
307 }
308 }
309 #endregion
310
311 #endregion
312 }

老项目用到depend组,通过组控制组下面所有KEY/VALUE。升级Core改写代码过程中了解到EnyimMemcachedCore相关用法,所以基于博客园Memcached整理了此类。

据说EnyimMemcachedCore开发团队不推荐使用静态类,尽可能地避免使用静态类。

在使用Startup.cs中依赖注入时碰到缓存写入失败,暂未找到原因,以下是我的操作步骤,有清楚的园友请留言告知,谢谢。

第一步:配置文件

 "enyimMemcached": {
"Servers": [
{
"Address": "127.0.0.1",
"Port": 11211
}
]
}

第二步:ConfigureServices配置AddEnyimMemcached

1
2
3
4
5
6
7
public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
 
            //memcachedcore1
            services.AddEnyimMemcached(options => Configuration.GetSection("enyimMemcached").Bind(options));
        }

第三步:Configure方法中使用

1
app.UseEnyimMemcached();//memcachedcore2

第四步:MVC模式下HomeController测试写入/读取

 private IMemcachedClient _memcachedClient;//调用memcachedcore3
public HomeController(IMemcachedClient memcachedClient)
{
_memcachedClient = memcachedClient;//赋值memcachedcore4
}
public IActionResult Index()
{   #region --测试memcachedcore-- MemcachedHelper.Set("memcached", "memcached-core", "memcachedcore" + DateTime.Now, 60);
string mh = MemcachedHelper.Get("memcached-core").ToString();
ViewData["mhelper"] = mh; //这种方式暂未找到合适赋值,待研究,赋值赋不上。
//删/增/取memcachedcore5
//var cacheKey = "memcachedcore";
////_memcachedClient.Add(cacheKey, "memcachedcore" + DateTime.Now, 60);//此方法赋不上值
////var result = _memcachedClient.Get(cacheKey);
//_memcachedClient.Remove(cacheKey);
//ViewData["memcachedcore"] = result.ToString();
#endregion }

UtilConf读取配置文件操作类

    public class UtilConf
{
private static IConfiguration config;
public static IConfiguration Configuration//加载配置文件
{
get
{
if (config != null) return config;
config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.Build();
return config;
}
set => config = value;
}
}

 2017-12-08 补充

如果多台memcached服务器,服务器时间一定要调整一致。如果不一致就会出现存不上值或过期日期不准确。

net core体系-web应用程序-4asp.net core2.0 项目实战(1)-6项目缓冲方案的更多相关文章

  1. net core体系-web应用程序-4asp.net core2.0 项目实战(任务管理系统)-2项目搭建

    系统要求 首先建议采用 Windows 10 专业版/企业版/教育版,且必须是64位操作系统,原因是docker装起来比较方便,Win7装起来比较麻烦,且不确定是否有其他问题(自己没有实践过) 其次W ...

  2. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-12基于cookie登录授权认证并实现前台会员、后台管理员同时登录

    1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...

  3. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-11项目日志解决方案

    本文目录1. Net下日志记录2. NLog的使用    2.1 添加nuget引用NLog.Web.AspNetCore    2.2 配置文件设置    2.3 依赖配置及调用    2.4 日志 ...

  4. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-2项目说明和源码下载

    本文目录1. 摘要2. Window下运行 3.linux下运行4. 开发记录5. 总结 1.概要 写<Asp.Net Core 2.0 项目实战>系列断断续续已经很长时间了,期间很多朋友 ...

  5. net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了   原文链接:https://www.cnblogs.com/yilezhu/p/9985451.ht ...

  6. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-13基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级

    1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...

  7. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-10项目各种全局帮助类

    本文目录 1.  前沿2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装3.XmlHelper快速操作xml文档4.SerializationHe ...

  8. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-9项目各种全局帮助类

    本文目录 1.  前沿2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装3.XmlHelper快速操作xml文档4.SerializationHe ...

  9. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-7项目缓冲方案( Redis)

    本文目录1. 摘要2. Redis配置3. RedisHelper4.使用实例 5. 总结 1.  摘要 由于內存存取速度远高于磁盘读取的特性,为了程序效率提高性能,通常会把常用的不常变动的数据存储在 ...

  10. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-3项目架构说明

    本文目录1. 摘要2. 框架介绍 3. 权限管理之多一点说明4. 总结 1.  摘要 NCMVC角色权限管理框架是由最近练习Net Core时抽时间整理的系统,后续能不能发展成一个cms还要看朋友们是 ...

随机推荐

  1. java乱码问题解决

    1.通过统一的过滤器进行了页面过滤(问题排除) 2.通过debug功能发现页面传到servelet和DAO中文都是OK的,可以说明在web程序端没有问题 问题就可能出现在数据库上面 首先查看数据库编码 ...

  2. 阿里云主机Nginx下配置NodeJS、Express和Forever

    https://cnodejs.org/topic/5059ce39fd37ea6b2f07e1a3 AngularJS中文社区即运行在阿里云主机上,本站使用Nginx引擎,为了AngularJS,我 ...

  3. 部署apache-tomcat环境

    软件体系: C/S:客户端/服务器,例如qq等app都属于C/S体系,除了编写服务端代码还需要编写客户端 优点:展现比较好,客户端会承受一点运算压力,安全性比较好 缺点:更新服务端的同时还需要更新客户 ...

  4. python-模块入门二(模块循环导入,区分python文件的两种用途,模块搜索路径,软件开发的目录规范)

    一.模块的循环导入问题 run.py # import m1 # 第一次导入 m1.py # 错误示范 ''' print('正在导入m1') from m2 import y #第一次导入m2 x= ...

  5. Codeforces 280D k-Maximum Subsequence Sum [模拟费用流,线段树]

    洛谷 Codeforces bzoj1,bzoj2 这可真是一道n倍经验题呢-- 思路 我首先想到了DP,然后矩阵,然后线段树,然后T飞-- 搜了题解之后发现是模拟费用流. 直接维护选k个子段时的最优 ...

  6. Oracle Blob查询和插入

    注:本文来源于<Oracle Blob查询和插入> 插入 UPDATE cmm05 SET OUTFILE = to_blob('12345690'): 查询: SELECT utl_ra ...

  7. Confluence 6 的 WebDAV 客户端整合介绍

    WebDAV 允许用户通过一个 WebDAV 客户端来访问 Confluence.例如,微软 Windows 的 'My Network Places'.通过为访问的用户提供权限,这个用户可以在 Co ...

  8. selenium关于断言的使用

    基本介绍: Selenium工具专门为WEB应用程序编写的一个验收测试工具. Selenium的核心:browser bot,是用JAVASCRIPT编写的. Selenium工具有4种:Seleni ...

  9. Socket网络编程(一)

    1.什么是网络通讯?(udp.tcp.netty.mina) udp:漂流瓶,每个人都可以向大海里面扔漂流瓶,不管有没有人捡到.(不管接收方有没有,我只往指定的地址发送东西,64kb以内) tcp:电 ...

  10. 团队开发工具git常用命令

    Git 常用命令 Git配置 git config --global user.name "storm" git config --global user.email " ...