net core体系-web应用程序-4asp.net core2.0 项目实战(1)-6项目缓冲方案
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项目缓冲方案的更多相关文章
- net core体系-web应用程序-4asp.net core2.0 项目实战(任务管理系统)-2项目搭建
系统要求 首先建议采用 Windows 10 专业版/企业版/教育版,且必须是64位操作系统,原因是docker装起来比较方便,Win7装起来比较麻烦,且不确定是否有其他问题(自己没有实践过) 其次W ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-12基于cookie登录授权认证并实现前台会员、后台管理员同时登录
1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...
- 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 日志 ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-2项目说明和源码下载
本文目录1. 摘要2. Window下运行 3.linux下运行4. 开发记录5. 总结 1.概要 写<Asp.Net Core 2.0 项目实战>系列断断续续已经很长时间了,期间很多朋友 ...
- 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 ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-13基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级
1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-10项目各种全局帮助类
本文目录 1. 前沿2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装3.XmlHelper快速操作xml文档4.SerializationHe ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-9项目各种全局帮助类
本文目录 1. 前沿2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装3.XmlHelper快速操作xml文档4.SerializationHe ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-7项目缓冲方案( Redis)
本文目录1. 摘要2. Redis配置3. RedisHelper4.使用实例 5. 总结 1. 摘要 由于內存存取速度远高于磁盘读取的特性,为了程序效率提高性能,通常会把常用的不常变动的数据存储在 ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-3项目架构说明
本文目录1. 摘要2. 框架介绍 3. 权限管理之多一点说明4. 总结 1. 摘要 NCMVC角色权限管理框架是由最近练习Net Core时抽时间整理的系统,后续能不能发展成一个cms还要看朋友们是 ...
随机推荐
- Openssl源代码整理学习---含P7/P10/P12说明
声明:建议结合Openssl源代码学习: 一.基础知识 1.Openssl 简史 OpenSSL项目是加拿大人Eric A.Yang 和Tim J.Hudson开发,现在有Openssl项目小组负责改 ...
- springboot:集成fastjson(教训)
网上有很多介绍,主要有两种. 1.在启动类中注入bean /** * 集成fastjson * * @return */ @Bean public HttpMessageConverters fast ...
- ebs 12.1.1 单节点多用户安装
本次测试环境:操作系统 oracle linux 6.9 oracle ebs 12.1.1 192.168.20.210 erpapp1.hthorizon.com erpapp1 yum ...
- python 安装mysql报错
原 安装Python mysqlclient出现“OSError: mysql_config not found”错误 2016年06月01日 12:15:11 wangtaoking1 阅读数:11 ...
- swift 学习- 18 -- 自动引用计数
// Swift 使用 自动引用计数 (ARC) 机制来跟踪和管理你的应用程序的内存, 通常情况下, Swift 内存管理机制会一直起作用, 你无须自己来考虑内存的管理, ARC 会在类的实例不再被使 ...
- Windows服务启动进程----Cjwdev.WindowsApi.dll
windows服务下无法启动外部程序 做一个windows服务监听服务,涉及到windows服务启动外部程序的一个过程,但是调试测试发现,无法简单的用process.start()这种方法, 原因是在 ...
- Confluence 6 找到你的支持识别代码(SEN)
你可以在下面 3 个地方找到你的 SEN 代码: 在 Confluence 中,进入 > 基本配置(General Configuration) > 许可证详细(License Deta ...
- Java的小实验——各种测试以及说明
日期:2018.10.07 星期五 博客期:014 一.Java中的位运算 代码如下: package Morts107; public class Test107 { public static v ...
- 浅析PHP中的闭包和匿名函数
PHP闭包和匿名函数使用的句法与普通函数相同,但闭包和匿名函数其实是伪装成函数的对象(Closure类的实例) .下面给大家介绍PHP中的闭包和匿名函数知识,需要的朋友参考下吧 闭包是指在创建时封 ...
- Metasploit (二)
1.测试一台搭建的主机 msf > db_nmap -n -A 10.140.110.16[*] Nmap: Starting Nmap 7.60 ( https://nmap.org ) at ...