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. lua 中 socket 通信示例

    server.lua #!/usr/bin/lua local socket = require("socket") host, port = "127.0.0.1&qu ...

  2. vue 不常见操作

     对 v-html 的扩展操作, 问题产生背景, 在vue 项目中,用v-html渲染 html字符串,这里面包括a 标签等内容,因为某种需求,a 的默认跳转不符合要求,要经过自己定义的方法跳转. 原 ...

  3. ajax返回的欧洲字符(例如:法文)乱码

    ajax返回值的乱码现象产生的相关代码如下: Java代码: JsonObject jsonObject = new JsonObject(); jsonObject.addProperty(&quo ...

  4. npm dev run 报错

    解决办法: npm run dev --port 8088 Error: listen EACCES 0.0.0.0:8080at Object.exports._errnoException (ut ...

  5. LuoGu P2863 [USACO06JAN]牛的舞会The Cow Prom

    题目传送门 这个题还是个缩点的板子题...... 答案就是size大于1的强连通分量的个数 加一个size来统计就好了 #include <iostream> #include <c ...

  6. 使用open live writer客户端写博客

    注:Windows Live Writer 已经停止更新,建议安装 Open Live Writer,下载地址: http://openlivewriter.org/ 使用open live writ ...

  7. android 使用opencv

    1.将已有的项目名称改名字,但一直报错 Error:A problem occurred configuring project ':app'.> executing external nati ...

  8. 华为手机浏览器 onclick失灵的问题

    开发h5 遇到的问题是华为浏览器onclick 点击失灵. 下面这个网站是检查 浏览器是否支持es6语法的网站 http://ruanyf.github.io/es-checker/index.cn. ...

  9. mysql 安装问题三:FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql_install_db: Data::Dumper

    解决方法是安装autoconf库,执行命令:yum -y install autoconf 安装完成之后继续执行安装mysql的命令:./scripts/mysql_install_db --user ...

  10. linux目录详解

    网卡的配置文件目录 /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0                                     ...