用到缓存架构,我们一般都会想到的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. 076 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 01 Java面向对象导学

    076 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 01 Java面向对象导学 本文知识点:Java面向对象导学 说明:因为时间紧张,本人 ...

  2. JavaScript reduce()的使用

    语法 arr.reduce(callback(accumulator, currentValue, index, array), initialValue) 参数 callback 执行数组中每个值 ...

  3. 50个你必须了解的Kubernetes面试问题

    Kubernetes一直是当今业界的流行语,也是最好的编排工具.它吸引了许多想要提升自己职业生涯的经验丰富的专业人士.HuaWei,Pokemon,Box,eBay,Ing,Yahoo Japan,S ...

  4. ORA-00001: unique constraint (string.string) violated 违反唯一约束条件(.)

    ORA-00001: unique constraint (string.string) violated   ORA-00001: 违反唯一约束条件(.) Cause: An UPDATE or I ...

  5. RFC 8684---TCP Extensions for Multipath Operation with Multiple Addresses

    https://datatracker.ietf.org/doc/rfc8684/?include_text=1 TCP Extensions for Multipath Operation with ...

  6. Python初学习:简单的练习题

    Python初学习 一些见到那的练习题: 初级难度 设计一重量转换器,输入以g为单位的数字后,返回换算结果以Kg为单位的结果 中级难度 设计一个求直角三角形斜边长的函数,(以两个直角边为参数,求最长边 ...

  7. vector专题

    <C++程序设计语言(第4部分:标准库)> 31.4 容器 31.4.1 vector 31.4.1.1 vector和增长 重要知识点:vector的内存布局 vector不会在添加每个 ...

  8. [论文阅读笔记] GEMSEC,Graph Embedding with Self Clustering

    [论文阅读笔记] GEMSEC: Graph Embedding with Self Clustering 本文结构 解决问题 主要贡献 算法原理 参考文献 (1) 解决问题 已经有一些工作在使用学习 ...

  9. python中jsonpath模块运用

    原文链接:https://www.cnblogs.com/denise1108/p/10265911.html 1. jsonpath介绍用来解析多层嵌套的json数据;JsonPath 是一种信息抽 ...

  10. idea创建servlet工程初体验

    servlet工程创建 前提:创建项目之前需要配置java环境变量 和tomcat配置,配置完成后进入如下操作. tomcat 安装和配置参考 https://www.cnblogs.com/xush ...