用到缓存架构,我们一般都会想到的Redis,因为它支持分布式,高可用,速率非常快。MemoryCache则相对较少提到,但是对于单体项目或者小型项目,memorycache还是是不错的选择。MemoryCache是netcore中集成的缓存架构,使用起来非常的简单方便。

meorycache简单的代码封装

  1     /// <summary>
2 /// memorycache管理类
3 /// </summary>
4 public class MemoryCacheManagement
5 {
6 public static MemoryCacheManagement Default = new MemoryCacheManagement();
7
8 private IMemoryCache _cache = new MemoryCache(new MemoryCacheOptions());
9 private MemoryCacheManagement()
10 {
11
12 }
13
14 /// <summary>
15 /// 设置缓存,不设置超时时间
16 /// </summary>
17 /// <typeparam name="T"></typeparam>
18 /// <param name="key"></param>
19 /// <param name="value"></param>
20 public void SetValue<T>(string key, T value)
21 {
22 if (string.IsNullOrEmpty(key))
23 {
24 throw new ArgumentNullException("key");
25 }
26 T t;
27 if (_cache.TryGetValue<T>(key, out t))
28 {
29 _cache.Remove(key);
30 }
31 _cache.Set(key, value);
32 }
33 /// <summary>
34 /// 设置缓存,并指定绝对超时时间
35 /// </summary>
36 /// <typeparam name="T"></typeparam>
37 /// <param name="key"></param>
38 /// <param name="value"></param>
39 /// <param name="absoluteTimeoutSeconds"></param>
40 public void SetValue<T>(string key, T value, int absoluteTimeoutSeconds)
41 {
42 if (string.IsNullOrEmpty(key))
43 {
44 throw new ArgumentNullException("key");
45 }
46 T t;
47 if (_cache.TryGetValue<T>(key, out t))
48 {
49 _cache.Remove(key);
50 }
51 _cache.Set<T>(key, value, DateTimeOffset.Now.AddSeconds(absoluteTimeoutSeconds));
52 }
53 /// <summary>
54 /// 设置缓存,并设定超时时间,不访问(滑动)超时时间
55 /// </summary>
56 /// <typeparam name="T"></typeparam>
57 /// <param name="key"></param>
58 /// <param name="value"></param>
59 /// <param name="absoluteTimeoutSeconds"></param>
60 /// <param name="slidingExpirationSeconds"></param>
61 public void SetValue<T>(string key, T value, int absoluteTimeoutSeconds, int slidingExpirationSeconds)
62 {
63 if (string.IsNullOrEmpty(key))
64 {
65 throw new ArgumentNullException("key");
66 }
67 T t;
68 if (_cache.TryGetValue<T>(key, out t))
69 {
70 _cache.Remove(key);
71 }
72 _cache.Set(key, value, new MemoryCacheEntryOptions()
73 {
74 AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(absoluteTimeoutSeconds), //绝对超时时间,
75 SlidingExpiration = TimeSpan.FromSeconds(slidingExpirationSeconds), //不访问超时时间(在这个指定的时段内没有使用则过期,否则顺延)
76 });
77 }
78 /// <summary>
79 /// 获取缓存值
80 /// </summary>
81 /// <typeparam name="T"></typeparam>
82 /// <param name="key"></param>
83 /// <returns></returns>
84 public T GetValue<T>(string key)
85 {
86 if (string.IsNullOrEmpty(key))
87 {
88 throw new ArgumentNullException("key");
89 }
90 T val = default(T);
91 _cache.TryGetValue<T>(key, out val);
92 return val;
93
94 }
95
96 /// <summary>
97 /// 判断缓存是否存在
98 /// </summary>
99 /// <param name="key"></param>
100 /// <returns></returns>
101 public bool CheckExists(string key)
102 {
103 if (string.IsNullOrEmpty(key))
104 {
105 throw new ArgumentNullException("key");
106 }
107 object val ;
108 return _cache.TryGetValue(key, out val);
109 }
110 /// <summary>
111 /// 清楚缓存值
112 /// </summary>
113 /// <param name="key"></param>
114 public void Remove(string key)
115 {
116 if (string.IsNullOrEmpty(key))
117 {
118 throw new ArgumentNullException("key");
119 }
120 _cache.Remove(key);
121 }
122 /// <summary>
123 /// 获取所有的Key
124 /// </summary>
125 /// <returns></returns>
126 public List<string> GetAllKey()
127 {
128 //TODO获取所有缓存key
129 throw new Exception("暂不用到,未实现");
130 }
131 /// <summary>
132 /// 获取所有的value
133 /// </summary>
134 /// <returns></returns>
135 public List<object> GetAllValue()
136 {
137 //TODO获取所有缓存值
138 throw new Exception("暂不用到,未实现");
139 }
140 }

以上就是MemorCache的简单封装实现,设置成单例使用起来还是比较简洁的。

但是对于MemoryCache的一些注意事项,我们还是需要弄清楚的

过期时间:

AbsoluteExpiration:绝对过期时间,超过指定的过期时间后再获取,或者压缩操作则会触发该缓存key过期

SlidingExpiration:滑动过期时间,再绝对过期时间范围内,在滑动过期时间范围内有调用该key,则滑动事件将重新记时,否则过期。

注意:memorycache的过期时间不是由定时任务或者线程实现的,而是通过有访问时触发判断是否过期,过期则删除(同时触发过期回调事件)。

MemoryCacheOptions参数:

缓存大小限制(SizeLimit)、压缩比例(ExpirationScanFrequency)、缓存权重(Priority)、过期扫描频率(ExpirationScanFrequency)

缓存大小限制:限制缓存的最大容量,当超过该容量时则触发压缩,移除部分数据,优先移除权重较低的。

压缩比例:触发压缩时,压缩的目标比例。

缓存权重:缓存的优先级别

过期扫描频率:其实它的机制跟它字面意义还是有些出入的,过期扫描频率是建立在有访问的前提下的。只有访问缓存了才可能会触发这个扫描,默认一分钟(也就是最快时是一分钟扫描一次)

Netcore中简单使用MemoryCache的更多相关文章

  1. .NetCore中简单使用EasyNetQ

    前言 我们在.Net中使用RabbitMQ,最原始的就是基于RabbitMQ.Client进行编码,在这个过程中我们需要通过代码约定和维护队列,Exchange等.如果是自行编码封装通用型的Rabbi ...

  2. netcore中的缓存介绍

    Cache(缓存)是优化web应用的常用方法,缓存存放在服务端的内存中,被所有用户共享.由于Cache存放在服务器的内存中,所以用户获取缓存资源的速度远比从服务器硬盘中获取快,但是从资源占有的角度考虑 ...

  3. .NetCore中EFCore的使用整理(二)-关联表查询

    EF常用处理关联加载的方式有3中:延迟加载(Lazy Loading).贪婪加载 (Eager Loading)以及显示加载. 一.EF Core  1.1 1.当前的版本,还不支持延迟加载(Lazy ...

  4. .NetCore中EFCore for MySql整理(三)之Pomelo.EntityFrameworkCore.MySql

    一.Pomelo.EntityFrameworkCore.MySql简介 Git源代码地址:https://github.com/PomeloFoundation/Pomelo.EntityFrame ...

  5. .NetCore中三种注入方式的思考

    该篇内容由个人博客点击跳转同步更新!转载请注明出处! .NetCore彻底诠释了"万物皆可注入"这句话的含义,在.NetCore中到处可见注入的使用.因此core中也提供了三种注入 ...

  6. 深入剖析.NETCORE中CORS(跨站资源共享)

    前言 由于现代互联网的飞速发展,我们在开发现代 Web 应用程序中,经常需要考虑多种类型的客户端访问服务的情况:而这种情况放在15年前几乎是不可想象的,在那个时代,我们更多的是考虑怎么把网页快速友好的 ...

  7. .netcore中的依赖注入

    IOC.DI相关概念的理解 1.依赖:简单的讲就是"引用到".例如AccountController.cs引用到IAccountService.cs,那么AccountContro ...

  8. 中介者模式及在NetCore中的使用MediatR来实现

    在现实生活中,常常会出现好多对象之间存在复杂的交互关系,这种交互关系常常是"网状结构",它要求每个对象都必须知道它需要交互的对象.例如,每个人必须记住他(她)所有朋友的电话:而且, ...

  9. Asp.NetCore 中Aop的应用

    前言 其实好多项目中,做一些数据拦截.数据缓存都有Aop的概念,只是实现方式不一样:之前大家可能都会利用过滤器来实现Aop的功能,如果是Asp.NetCore的话,也可能会使用中间件: 而这种实现方式 ...

随机推荐

  1. Mac 效率工具必备神器 —— Alfred

    前言 alfred 这款软件称为「神器」真是当之无愧.今天专门总结一下,作为之前 Mac 配置教程-开发篇 的补充. 需要说明的是,如果你发现我介绍的功能无法使用,则代表需要花钱购买它的 Powerp ...

  2. 【转载】C/走迷宫代码

    1 #include<iostream> 2 #include<windows.h> 3 #include"GotoXY.h" 4 #include < ...

  3. matlab中set用法

    来源:https://www.cnblogs.com/sddai/p/5467500.html 1.MATLAB给每种对象的每一个属性规定了一个名字,称为属性名,而属性名的取值成为属性值.例如,Lin ...

  4. docker-命令帮助

    1. 命令参考     http://www.runoob.com/docker/docker-command-manual.html2. docker-命令,可以使用docker --help查看或 ...

  5. Prometheus 系列开篇:为什么要学 Prometheus ?

    「Prometheus 系列开篇:为什么要学 Prometheus ?」首发于[陈树义]公众号,点击跳转到原文https://mp.weixin.qq.com/s/HCS6X3l6nVBw_hAnd6 ...

  6. 微信小程序中使用 npm包管理 (保姆式教程)

    打开自己的微信小程序项目,在勾选这个选项 然后在第一次应该是失败的提示"没有找到可以构建的npm包". 在 小程序的根目录下比如我的项目如图: 右击鼠标在终端中打开. 然后输入:n ...

  7. 【idea】重装系统(格式化C盘后)idea无法导入maven(jdk重装了,版本不同),结果报错!

    [以下部分截图]2019-11-25 09:48:49,045 [ 108964]   WARN -      #org.jetbrains.idea.maven - Cannot open inde ...

  8. Python错误:AssertionError: group argument must be None for now

    运行多线程出现的错误 调试了很久,最后发先 __init__ 写错了,修改后后,运行正确.

  9. phpstorm10.0.3 下载与激活

    phpstorm10.0.3 百度网盘下载   提取码: kqvc 激活服务器: http://jetbrains.tencent.click/ (2016-09-19 可用) http://owo. ...

  10. 第十九章 DHCP原理介绍

    一.为什么使用DHCP 1.手动为局域网中大量主机配置IP地址.掩码.网关等参数的工作繁琐,容易出错 2.DHCP可以自动为局域网中主机完成TCP/IP协议配置 3.DHCP自动配置避免了IP地址冲突 ...