手机版

的内存缓存选项 NET核心系列

时间:2021-08-30 来源:互联网 编辑:宝哥软件园 浏览:

在前一篇文章“拥抱。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

时钟,顾名思义就是用来提供时间的成员,缓存中使用了大量的时间来判断缓存是否过期。

压缩压力已经被放弃了,所以不要担心

过期扫描频率过期扫描频率(默认为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或者邮箱删除。