.NET Core系列之MemoryCache 缓存选项
 更新时间:2018年08月14日 14:30:58   作者:KAnts  

这篇文章主要介绍了.NET Core系列之MemoryCache 缓存选项,详细的介绍一下 MSCache 中的 Options,由此来介绍一些 MSCache 中的内部机制,感兴趣的小伙伴们可以参考一下

在上一篇 ”拥抱.NET Core系列:MemoryCache 缓存过期” 中我们详细的了解了缓存过期相关的内容,今天我们来介绍一下 MSCache 中的 Options,由此来介绍一些 MSCache 中的内部机制。
MSCache项目
MSCache 目前最新的正式版是 2.0.0,预览版是2.1.0,会与 .NETCore 2.1 一起发布。本篇用了2.0.0版本
开源在 GitHub 上,仓库地址是:github.com/aspnet/Caching
NuGet地址为:www.nuget.org/packages/Microsoft.Extensions.Caching.Memory/2.0.0
MemoryCacheOptions

Clock 顾名思义,是用来提供时间的一个成员,缓存里面大量用到了时间来判断缓存是否过期。
CompactOnMemoryPressure 已经被废弃,可以不用管
ExpirationScanFrequency 过期扫描频率(默认为1分钟,可以理解为每过多久移除一次过期的缓存项)
SizeLimit 缓存大小限制(这属于一个说明性属性,而且单位也不是缓存数目,而是缓存真正占用的空间大小)
CompactionPercentage 压缩率(默认0.05,百分比)
Clock
初次见到的时候以为是用来自定义 LocalTime,其实不是(当然要这么做也可以),在 MSCache 中只允许用 Utc 时间,但是为什么既然都是 Utc 时间还要留这个扩展选项呢?
很简单,默认的当前时间是当前系统的当前时间,在一些对时间精度要求比较高的情况下就可以重写 Clock 来实现自己自定义的获取当前时间的逻辑。
ExpirationScanFrequency
缓存无非是一个字典表,当一些缓存项过期失效时候我们需要移除字典表里面的内容。
然而准确的做到每个缓冲项过期就进行移除是非常损失性能的(类似GC),所以 MSCache 提供了一个属性来设置,没间隔多久才进行一次过期缓存移除。
这个值默认为1分钟。
什么时候会进行过期缓存清理?

添加新的
获取缓存项
删除缓存项目
当有缓存项过期(通过过期回调)

这边就解释了上一节的最后为什么没有回调输出。
因为MSCache里面没有使用定时器来进行过期扫描。
ps:缓存过期清理是一个异步方法也就是不会堵塞当前线程。
SizeLimit
这个属性在 MemoryCache 中几乎没有用,在 MemoryCache 中关于缓存项的大小默认都是null或0。
因为这个属性并不是缓存项的数量,而是缓存真正占用的空间大小,如这个缓存项占用了多少内存。
然而在.NET中计算一个对象所占用的内存是很难且损耗性能的,所以在 MemoryCache 中这个属性几乎可以看做没有。
当然你可以通过手动设置缓存项的Size来启用相关功能。这边我们只简单说明,详细讲解会在后面的分布式缓存中进行说明。
这个属性的作用是:当所有缓存大小超过这个值的时候进行一次缓存压缩。
CompactionPercentage
当内存大小超过 SizeLimit 时候进行压缩的比率,默认值是0.05,也就是百分之5。
具体的计算方式是
得到剩余的缓存大小 SizeLimit * 1 – CompactionPercentage
得到需要压缩的大小 CurrentSize – (SizeLimit * 1 – CompactionPercentage)
缓存的清理优先级

这时候就牵扯到 CacheEntry 中的 Priority 属性了,当发生这种情况的时候 MSCache 会按以下优先级进行压缩处理

Low
Normal
High

为什么没有 NeverRemove ?因为 NeverRemove 永远不会在超过 SizeLimt 时候进行清理。
那么当缓存大小超过SizeLimit时,MSCache会
先清理Low优先级的缓存项(不管是否过期)
再清理Normal优先级的缓存项(不管是否过期)
继续清理High优先级的缓存项(不管是否过期)
CacheEntry 默认的 优先级为:Normal。
写在最后
今天介绍了一些 MSCache 的内部机制,后续会讲一下 缓存域 和 一些小技巧。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持华域联盟。 

您可能感兴趣的文章:如何在ASP.Net Core使用分布式缓存的实现Asp.net Core 3.1基于AspectCore实现AOP实现事务、缓存拦截器功能.NetCore之接口缓存的实现示例ASP.NET Core中的Http缓存使用.NET Core系列之MemoryCache 缓存域.NET Core系列之MemoryCache 缓存过期详解Asp.Net Core 2.1+的视图缓存(响应缓存)ASP.NET Core缓存静态资源示例详解Asp.Net中MVC缓存详解详解.Net缓存之MemoryCahe

MemoryCache
缓存
选项

相关文章
如何使用.NET Core 选项模式【Options】这篇文章主要介绍了如何使用.NET Core 选项模式,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下 2020-07-07
System.Timers.Timer定时执行程序示例代码如果是某个逻辑功能的定时,可以将code放到逻辑功能的类的静态构造函数中,在该逻辑类第一次执行时,静态构造函数会被调用,则定时自然启动 2013-06-06
WPF气泡样式弹窗效果代码分享这篇文章主要为大家详细介绍了WPF气泡样式弹窗效果的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 2016-09-09
Asp.net内置对象之Cookies(简介/属性方法/基本操作及实例)本文将围绕cookies了解Cookies对象/Cookie对象的属性和方法/Cookie的基本操作及实例:Cookie的写入和读取/Cookie对象相比Session、Application的优缺点扥等,感兴趣的朋友可以了解下,或许对你学习cookies有所帮助 2013-02-02
Remoting和Webservice的详细介绍及区别这篇文章主要介绍了Remoting和Webservice的详细介绍及区别的相关资料,需要的朋友可以参考下 2016-11-11
ASP.NET Core AutoWrapper 自定义响应输出实现这篇文章主要介绍了ASP.NET Core AutoWrapper 自定义响应输出实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2020-08-08
利用asp.net实现生成不重复订单号订单号在购物过程中起到了很好的识别作用,更方便的有利于工作人员识别商品,本文介绍利用asp.net实现生成订单号 2012-12-12
生成代码从T到T1、T2、Tn自动生成多个类型的泛型实例代码这篇文章主要给大家介绍了关于生成代码从T到T1、T2、Tn自动生成多个类型的泛型的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧 2018-09-09
asp.net 获取目录下的文件数和文件夹数遍历一个文件夹中的文件,需要用到DirectoryInfo类中的一个重要的方法GetFileSystemInfos(),此方法返回指定的是与搜索条件相匹配的文件和子目录的强类型 FileSystemInfo对象的数组。

2010-07-07
httpHandler实现.Net无后缀名Web访问的实现解析有时候我们看到很多网站是网址是没有后缀名的,其实.net中可以通过httpHandler来实现。 2011-10-10

最新评论

声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。