.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之后是通过在运行的时候根据配置来实 ...
随机推荐
- iterm自动登录ssh脚本
经常在工作中需要切换到不同的服务器去部署,或者查看日志,每次登录都要去找对应的IP和地址,非常麻烦,最终决定使用iterm2+脚本来实现自动登录. 1.iterm2(下载安装不再介绍http://ww ...
- 数据库主键ID生成策略
前言: 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,下面介绍一些常见的ID生成策略. Sequence ID UUID GUID COMB Snowflake 最开始的自增ID为了实现分库 ...
- 字符编码的来源,ascii、unicode和utf-8编码的关系
字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特 ...
- [中英对照]INTEL与AT&T汇编语法对比
本文首先对文章Intel and AT&T Syntax做一个中英文对照翻译,然后给出一个简单的例子,再用gdb反汇编后,对INTEL与AT&T的汇编语法进行对照从而加深理解. Int ...
- ASP.NET Core 中的依赖注入
目录 什么是依赖注入 ASP .NET Core 中使用依赖注入 注册 使用 释放 替换为其它的 Ioc 容器 参考 什么是依赖注入 软件设计原则中有一个依赖倒置原则(DIP),为了更好的解耦,讲究要 ...
- redis数据类型(六)Sorted set类型
一.sorted set类型 sorted set是有序集合,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,会自动重新按新的值调整顺序.可以理解了有两列的 m ...
- throws 与 throw
摘录自:http://blog.csdn.net/ronawilliam/article/details/3299676 void doA() throws Exception1, Exception ...
- c#和java中封装字段的不同
c#: private String name; public String Name { get { return name; } set { name = value; } } .csharpco ...
- Yii2:记一次尴尬的bug
创建一个文章模块,写完添加动作之后,分配到视图,发现报错: Exception (Not Supported) 'yii\base\NotSupportedException' with messag ...
- 网页title添加图标
<link rel="shortcut icon" href="1.ico"> href="图片名字.ico"; 图片后缀名为: ...