.net core系列之《在.net core中使用MemoryCache实现本地缓存》
说到内存缓存MemoryCache不由的让我想起.Net Framework中的MemoryCache,它位于 System.Runtime.Caching 程序集中。
接下来我们来看看.net core中的MemoryCache又有什么与众不同的地方吧。
一、基本实现
1、打开NuGet包管理器搜索并安装 Microsoft.Extensions.Caching.Memory 包,或者从程序包管理控制台执行 Install-Package Microsoft.Extensions.Caching.Memory 命令
2、接下来看实现代码
static void Main(string[] args)
{
MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions());
memoryCache.Set("name","tom");
var value = memoryCache.Get("name");
Console.WriteLine(value); Console.ReadKey();
}
结果如下:

二、缓存容量控制:SizeLimit
1、当你用SizeLimit属性设置了这个缓存大小之后,你就必须为你缓存中的每一项设置大小,否则则报错。当然,当你的大小达到你设置的SizeLimit时,你再设置缓存,它会自动清理一些缓存再缓存你设置的值
2、代码如下:
static void Main(string[] args)
{
MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions()
{
SizeLimit =
});
for (int i = ; i < 1000; i++)
{
memoryCache.Set<int>(i.ToString(), i, new MemoryCacheEntryOptions() {
Size =
});
}
Console.WriteLine(memoryCache.Count); Console.ReadKey();
}
结果如下:

实际结果不是1000,而是100
我们来看看它设置值的过程是什么样的:

由于设置的大小为100,达到100时再设置缓存项就会自动清理掉一部分
三、缓期的过期问题
1、被动过期
代码如下:
static void Main(string[] args)
{
MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions());
memoryCache.Set("name", "jack", new MemoryCacheEntryOptions()
{
AbsoluteExpiration = DateTimeOffset.Now.AddSeconds()//设置为5秒后过期
});
while (true)
{
System.Threading.Thread.Sleep();
string value;
if (!memoryCache.TryGetValue("name", out value))
{
value = "已过期";
}
Console.WriteLine(value);
}
//Console.ReadKey();
}
结果如下:

2、主动过期
static void Main(string[] args)
{
MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions()); CancellationTokenSource tokenSource = new CancellationTokenSource();
var cacheOptins = new MemoryCacheEntryOptions()
{
AbsoluteExpiration = DateTimeOffset.Now.AddSeconds()//设置为10秒后过期
};
cacheOptins.AddExpirationToken(new CancellationChangeToken(tokenSource.Token)); memoryCache.Set("name", "jack", cacheOptins); tokenSource.CancelAfter();//主动设置为2秒过期
while (true)
{
Thread.Sleep();
string value;
if (!memoryCache.TryGetValue("name", out value))
{
value = "已过期";
}
Console.WriteLine(value);
}
//Console.ReadKey();
}
结果如下:

3、过期后回调:
static void Main(string[] args)
{
MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions()); CancellationTokenSource tokenSource = new CancellationTokenSource();
var cacheOptins = new MemoryCacheEntryOptions()
{
AbsoluteExpiration = DateTimeOffset.Now.AddSeconds()//设置为10秒后过期
};
cacheOptins.AddExpirationToken(new CancellationChangeToken(tokenSource.Token)); cacheOptins.RegisterPostEvictionCallback((key, value, reason, state) => {
Console.WriteLine(reason);
}); memoryCache.Set("name", "jack", cacheOptins); tokenSource.CancelAfter();//主动设置为2秒过期
while (true)
{
Thread.Sleep();
string value;
if (!memoryCache.TryGetValue("name", out value))
{
value = "已过期";
}
Console.WriteLine(value);
}
//Console.ReadKey();
}
结果如下:

四、其它的一些设置
1、原子性操作
memoryCache.GetOrCreate("name", entry => "lucy");
2、优先级设置,这个设置是为了配合压缩缓存的
以下是系统定义的优先级的枚举
public enum CacheItemPriority
{
Low = ,
Normal = ,
High = ,
NeverRemove =
}
接下来设定优先级
var cacheOptins = new MemoryCacheEntryOptions()
{
Priority= CacheItemPriority.Low,
AbsoluteExpiration = DateTimeOffset.Now.AddSeconds()//设置为10秒后过期
};
3、缓存压缩
static void Main(string[] args)
{
MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions()
{
SizeLimit =
});
for (int i = ; i < ; i++)
{
CacheItemPriority priority = CacheItemPriority.Low;
if ( < i && i < )
priority = CacheItemPriority.Normal;
else if ( < i && i < )
priority = CacheItemPriority.High;
else
priority = CacheItemPriority.NeverRemove;
memoryCache.Set(i.ToString(), i.ToString(), new MemoryCacheEntryOptions()
{
Size = ,
Priority = priority,
AbsoluteExpiration = DateTimeOffset.Now.AddSeconds()//设置为10秒后过期
});
}
memoryCache.Compact(0.2);//压缩20%
Console.WriteLine(memoryCache.Count);
for (int i = ; i < ; i++)
{
Console.WriteLine(memoryCache.Get(i.ToString()));
}
Console.ReadKey();
}
结果如下:
压缩后的缓存项数:

被压缩的缓存项:

根据结果可知道,优先级为 CacheItemPriority.Normal 的数据被压缩掉了,由此可见,优先级为 CacheItemPriority.Low 的并没有参加压缩。
压缩的优先级顺序是 CacheItemPriority.Normal>CacheItemPriority.High>CacheItemPriority.NeverRemove
.net core系列之《在.net core中使用MemoryCache实现本地缓存》的更多相关文章
- .net core系列之《.net core内置IOC容器ServiceCollection》
一.IOC介绍 IOC:全名(Inversion of Control)-控制反转 IOC意味着我们将对象的创建控制权交给了外部容器,我们不管它是如何创建的,我们只需要知道,当我们想要某个实例时,我们 ...
- Asp.Net Core 内置IOC容器的理解
Asp.Net Core 内置IOC容器的理解 01.使用IOC容器的好处 对接口和实现类由原来的零散式管理,到现在的集中式管理. 对类和接口之间的关系,有多种注入模式(构造函数注入.属性注入等). ...
- net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解
asp.net core 内置DI容器的一点小理解 DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...
- NET Core 3.0 AutoFac替换内置DI的新姿势
原文:NET Core 3.0 AutoFac替换内置DI的新姿势 .NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原 ...
- 浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】
原文:浏览器扩展系列----给MSTHML添加内置脚本对象[包括自定义事件] 使用场合: 在程序中使用WebBrowser或相关的控件如:axWebBrowser等.打开本地的html文件时,可以在h ...
- 简单讲解Asp.Net Core自带IOC容器ServiceCollection
一. 理解ServiceCollection之前先要熟悉几个概念:DIP.IOC.DI.Ioc容器: 二. 接下来先简单说一下几个概念问题: 1.DIP(依赖倒置原则):六大设计原则里面一种设计原 ...
- ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件
应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用. ASP.NET ...
- asp.net core 内置DI容器的一点小理解
DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IOC). 具体体现为Micorosoft.Extensio ...
- 学习笔记:GLSL Core Tutorial – Vertex Shader(内置变量说明)
1.每个Vertex Shader都有用户定义的输入属性,例如:位置,法线向量和纹理坐标等.Vertex Shaders也接收一致变量(uniform variables). uniform vari ...
- .net core 2.0学习记录(三):内置IOC与DI的使用
本篇的话介绍下IOC和ID的含义以及如何使用.Net Core中的DI. 一.我是这么理解IOC和DI的: IOC:没有用IOC之前是直接new实例来赋值,使用IOC之后是通过在运行的时候根据配置来实 ...
随机推荐
- springboot项目:登录 登录aop拦截 使用Redis与cookie 进行设置获取清除操作
登录.登出: 第一步:在pom文件中引入依赖 <dependency> <groupId>org.springframework.boot</groupId> &l ...
- wap webapp app区别
“手机WAP版网站”.“手机触屏版网站”.“手机APP应用软件”: wap webapp app区别 电脑版:台式机或者笔记本访问,兼容各个浏览器: Wap版:用于传统智能手机,屏幕小,适合使用手机键 ...
- Android多媒体之照相机
1.调用系统的照相机 public void click(View view) { // 激活系统的照相机拍照 Intent intent = new Intent("android.med ...
- Cocos文档案例游戏设计的梳理与分析
导语:这是一篇新手教程,适用于已看完Cocos官方文档,但还对游戏设计.运行流程不熟悉的新人.这篇教程是对文档[快速上手]里那款名叫"摘星星"的坑爹小游戏(文档原话)流程的梳理,以 ...
- 虹软人脸识别在 linux中so文件加载不到的问题
其实是可以加载到的,不过是so文件放的位置不一对,最简单的方式是放在 /usr/lib64 目录下,也可自己设置. so文件加载不到会报这个错误: .lang.UnsatisfiedLinkEr ...
- 入门系列之使用fail2ban防御SSH服务器的暴力破解攻击
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由SQL GM发表于云+社区专栏 介绍 对于SSH服务的常见的攻击就是暴力破解攻击--远程攻击者通过不同的密码来无限次地进行登录尝试.当 ...
- R语言格式化数字和字符串format函数
数字和字符串可以使用 format()函数的格式化为特定样式. 语法 format()函数的基本语法是: format(x, digits, nsmall,scientific,width,justi ...
- VFL子视图居中
今天做UI用VFL适配在View上添加一个图片想让指定宽高的图片居中显示,我用下面的代码想着能实现可是出来的效果并没有居中. UIImageView *headView=[[UIImageView a ...
- DateTime compare
DateTime t1 = new DateTime(100); DateTime t2 = new DateTime(20); if (DateTime.Compare(t1, t2) > 0 ...
- linux运维人员成长
原文地址:https://blog.csdn.net/kwame211/article/details/78059331 初级篇 linux运维人员常用工具拓扑详见: 1rsync工具 很多地方经常会 ...