用到缓存架构,我们一般都会想到的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. makefile实验二 对目标的深入理解 以及rebuild build clean的实现

    (一) rebuild build clean的实现 新知识点: 当一个目标的依赖是一个伪目标时,这个伪目标的规则一定会被执行. 贴实验代码 CC := gcc Target := helloworl ...

  2. 【转载】绕过CDN找到源站的思路

    [原文:https://mp.weixin.qq.com/s/8NUvPqEzVjO3XbmCBukUvQ] 绕过CDN的思路 网上有很多绕过CDN的思路,但是存在很多问题,以下是收集并总结的思路.站 ...

  3. PADS Layout VX.2.3 灌铜之后没有显示整块铜皮的原因

    操作系统:Windows 10 x64 工具1:PADS Layout VX.2.3 灌铜之后没有显示整块铜皮,如下图所示: 点击菜单Tools > Options...(快捷键:Ctrl + ...

  4. 【题解】NOIP2018 旅行

    题目戳我 \(\text{Solution:}\) 首先题目描述有一点不准确:回头是必须要走完一条路无路可走的时候才能返回. 对于树的情况:显然贪心做就完事了. 对于基环树的情况:对于一个\(n\)条 ...

  5. docker 搭建LNMP网站平台

    准备好镜像 1.创建网络 docker network create lnmp 测试环境需删除全部之前起的容器 docker rm -f $(docker ps -a |awk '{print $1} ...

  6. 优质分享 | Spring Boot 入门到放弃!!!

    持续原创输出,点击上方蓝字关注我 目录 前言 视频目录 如何获取? 总结 前言 最近不知不觉写Spring Boot专栏已经写了九篇文章了,从最底层的项目搭建到源码解析以及高级整合的部分,作者一直在精 ...

  7. 「Redis」字符串

    原文链接:https://www.changxuan.top/?p=1109 简介 Redis 中自定义的字符串结构. 字符串是 Redis 中最常用的一种数据类型,在 Redis 中专门封装了一个字 ...

  8. YCM 安装小记

    layout: post title: YCM 安装小记 半夜,女朋友在那边抱怨购物车的物品秒无货,我这边刚好成功安装了vim上最难装的插件--YouCompleteMe,内心非常激动,于是本着取之于 ...

  9. shell脚本算术运算

    自增自减操作 用let命令可以实现自增自减的命令,不需要$符号: #!/bin/bash set -e n=100 let n++ echo $n 还可以实现自增自减指定的值: #!/bin/bash ...

  10. C语言必踩神坑,世上本没有坑,摔的人多了,也就有了坑!

    这是一个伤心的故事,有多少小伙伴在写C语言代码时遇到过的情景! 提问:C语言中,未初始化的局部变量到底是多少? 答案往往是: 与编译器有关: 可能但不保证初始化为0: 未确定. 总之,全部都是些一本正 ...