用到缓存架构,我们一般都会想到的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. IDEA 使用的配置

    IDEA 使用 工欲善其事必先利其器,选择适合自己的 IDE,会让自己事倍功半.作为 Java 开发环境,有人喜欢 Eclipse,有人喜欢 idea,这其中的差别对比这里不做对比,需要了解的朋友可以 ...

  2. RT Thread的SPI设备驱动框架的使用以及内部机制分析

    注释:这是19年初的博客,写得很一般,理解不到位也不全面.19年末得空时又重新看了RTThread的SPI和GPIO,这次理解得比较深刻.有时间时再整理上传. -------------------- ...

  3. Codeforces Global Round 11 个人题解(B题)

    Codeforces Global Round 11 1427A. Avoiding Zero 题目链接:click here 待补 1427B. Chess Cheater 题目链接:click h ...

  4. Informatica报错“表或视图不存在”的某种原因

    软件版本:9.6.1 背景:测试将OLTP数据库的用户信息表(CUST_INFO)抽取到DW库(DW_CUST_INFO) 问题:工作流启动后,报错RR_4035,并告知表或视图不存在 分析:在导入源 ...

  5. git add 添加错文件如何撤销

    git add 添加 多余文件 这样的错误是由于, 有的时候 可能 git add . (空格+ 点) 表示当前目录所有文件,不小心就会提交其他文件 git add 如果添加了错误的文件的话 以下是撤 ...

  6. Redis 客户端 Jedis、lettuce 和 Redisson 对比

    Redis 支持多种语言的客户端,下面列举了部分 Redis 支持的客户端语言,大家可以通过官网查看 Redis 支持的客户端详情. C语言 C++ C# Java Python Node.js PH ...

  7. Golang数组和切片的区别

    大纲 数组是固定大小 切片不是动态数组,可以扩容 区别 定义方式不一样 初始化方法不一样 package main import "fmt" func main() { // -- ...

  8. 开源 Open Source

    FREE 开源不等于免费 代表自由 开源 Open Source软件和源代码提供给所有人,自由分发软件和源代码能够修改和创建衍生作品软件分类:商业   收费使用  代码不公开共享  免费用 代码不公开 ...

  9. Java实现:抛开jieba等工具,写HMM+维特比算法进行词性标注

    一.前言:词性标注 二.经典维特比算法(Viterbi) 三.算法实现 四.完整代码 五.效果演示: 六.总结 一.前言:词性标注 词性标注(Part-Of-Speech tagging, POS t ...

  10. Microsoft.Extensions.DependencyInjection中的Transient依赖注入关系,使用不当会造成内存泄漏

    Microsoft.Extensions.DependencyInjection中(下面简称DI)的Transient依赖注入关系,表示每次DI获取一个全新的注入对象.但是使用Transient依赖注 ...