的内存缓存选项 NET核心系列
在前一篇文章“拥抱。NET Core系列:MemoryCache过期”,我们详细了解了缓存过期。今天,我们将介绍MSCache中的选项,然后介绍MSCache中的一些内部机制。
MSCache项目
mscache最新官方版本为2.0.0,预览版为2.1.0,将与一起发布。NETCore 2.1。本文使用2.0.0版GitHub上的开源,仓库地址是:https://github.com/aspnet/Caching
NuGet的地址是:https://www.nuget.org/packages/Microsoft.extensions.caching.memory/2.0.0
MemoryCacheOptions
![](https://www.baoge.net/d/file/p/2021/08-30/0036cc202b63b02d07c9fa271ad2ef50.png)
时钟,顾名思义就是用来提供时间的成员,缓存中使用了大量的时间来判断缓存是否过期。
压缩压力已经被放弃了,所以不要担心
过期扫描频率过期扫描频率(默认为1分钟,可以理解为删除过期缓存项目的频率)
大小限制缓存大小限制(这是一个描述性属性,单位不是缓存的数量,而是缓存占用的实际空间)
压缩比百分比压缩比(默认为0.05,百分比)
时钟
第一次看到的时候,我以为是用来自定义LocalTime的,其实不是(当然你可以)。在MSCache中,只允许使用Utc时间,但是既然是Utc时间,为什么要保留这个扩展选项呢?
很简单,默认的当前时间就是当前系统的当前时间。在某些时间精度较高的情况下,可以重写Clock来实现自己获取当前时间的自定义逻辑。
ExpirationScanFrequency
缓存无非是一个字典表。当一些缓存项目过期时,我们需要删除字典表的内容。然而,当每个缓冲区项目过期时,精确地删除它是一个巨大的性能损失(类似于垃圾收集)。因此,MSCache提供了一个要设置的属性,并且不需要很长时间就可以删除过期的缓存。
该值默认为1分钟。
过期的缓存什么时候清理?
添加新的缓存条目并删除缓存条目。这解释了为什么在前一节结束时没有回调输出。
因为MSCache不使用定时器来扫描逾期。
ps:缓存过期清除是一种异步方法,也就是说,它不会阻塞当前线程。
SizeLimit
这个属性在MemoryCache中几乎没有用,MemoryCache中缓存项的大小默认为null或0。因为这个属性不是缓存项目的数量,而是缓存占用的实际空间,比如这个缓存项目占用了多少内存。
然而,在。NET中,很难计算一个对象占用的内存,从而导致性能的损失,所以这个属性在MemoryCache中几乎可以认为是没有的。
当然,您可以通过手动设置缓存项目的大小来启用相关功能。这里我们只简单解释一下,详细的解释将在后面的分布式缓存中解释。
该属性的功能是在所有缓存大小超过该值时压缩缓存一次。
CompactionPercentage
当内存大小超过SizeLimit时,默认值为0.05,即5%。具体计算方法是
获取剩余缓存大小大小限制* 1压缩百分比
获取要压缩的大小当前大小(大小限制* 1压缩百分比)
缓存的清理优先级
此时,涉及到缓存条目中的优先级属性。发生这种情况时,MSCache将根据以下优先级进行压缩
低正常高为什么没有NeverRemove?因为当超过大小限制时,从不删除永远不会清理。
然后,当缓存大小超过大小限制时,MSCache将
首先清除优先级低的缓存项目(无论是否过期)
然后清除具有正常优先级的缓存项目(无论是否过期)
继续清理高优先级缓存项目(无论是否过期)
缓存条目的默认优先级为:正常。
今天
写在最后
介绍了MSCache的一些内部机制,接下来我们就来说说缓存域和一些小技巧。以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
版权声明:的内存缓存选项 NET核心系列是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。