.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之后是通过在运行的时候根据配置来实 ...
随机推荐
- (转)Mysql主从复制搭建及详解
http://www.cnblogs.com/kevingrace/p/6256603.html---------Mysql主从同步(1)-主从/主主环境部署梳理 原文:http://blog.csd ...
- RabbitMQ初学之一:exchange与queue的绑定
最近公司需要使用RabbitMQ,但我之前一直使用的是ActiveMQ,对RabbitMQ进行了初步的学习,但是还不系统,自己做了一些小测试,怕自己以后忘了 一. 背景 拿到代码以后,发现,生产者在向 ...
- 2-8 js基础 jsonp封装
'use strict'; function jsonp(json){ json = json||{} if(!json.url)return; json.data=json.data||{}; js ...
- JAR,WAR,EAR的使用与区别
WAR(Web Archive file)网络应用程序文件 是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件.为 J2EE 应用程序创建的 JAR 文件是 EAR 文件(企业 JAR 文 ...
- 大数据sql引擎
Hive:把sql解析后用MapReduce跑 SparkSQL:把sql解析后用Spark跑,比hive快点 Phoenix:一个绕过了MapReduce运行在HBase上的SQL框架 Drill/ ...
- 【转】SQL SERVER 2005/2008 中关于架构的理解
在一次的实际工作中碰到以下情况,在 SQL SERVER 2008中,新建了一个新用户去访问几张由其他用户创建的表,但是无法进行查询,提示“对象名'CustomEntry' 无效.”.当带上了架构名称 ...
- SQL:存储过程
1/什么是存储过程及概念 Transact-SQL中的存储过程,非常类似于.Net语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可 ...
- 【angular5项目积累总结】消息订阅服务
code import { Injectable } from '@angular/core'; import { Subject } from 'rxjs/Subject'; @Injectable ...
- Mysql与InnoDB优化
Mysql可以从以下几个方面进行数据库优化: SQL及索引优化: sql优化: 优化count select count(*) ,count(id) from t; #count(*) 会包含null ...
- 十六、Condition等待通知
一.简介 我们可以使用syncronized和wait,notify实现等待通知.而syncronized的高级实现Lock,也可以实现等待通知,需要构造Condition的实例对象. JDK文档:h ...