本文主要介绍。网芯系列。边肖认为这很好。现在分享给大家,给大家一个参考。来和边肖一起看看吧。
目录
MSCache项目提供的到期方式是绝对时间到期滑动时间到期自定义到期策略组合拳缓存到期回调写在最后。在最后一篇文章《拥抱。NET Core系列:MemoryCache入门》,我们基本了解了缓存的添加、删除和获取,所以今天我们就来看看缓存的过期机制。这里和上一篇文章一样,“微软。扩展。缓存。存储器”将简称为MSCache。
MSCache项目
MSCache最新正式版为2.0.0,预览版为2.1.0,将与一同发布。NETCore 2.1。本文使用2.0.0版。
在开源的GitHub上,仓库地址是:https://github.com/aspnet/Caching.
NuGet的地址是:https://www . nu get . org/packages/Microsoft . extensions . caching . memory/2 . 0 . 0。
MSCache提供的过期方式
从源代码来看,MSCache提供了以下三种缓存过期方式
绝对过期(指定在固定时间点过期)滑动过期(在特定时间长度内未命中则过期)过期令牌(自定义过期)
让我们一个一个的来看看这些方法。
绝对时间到期
绝对过期非常简单,MS提供了一个扩展方法“SetAbsoluteExpiration”来设置绝对过期时间。
在这里,第一个方法的定义中的Relative意味着它在从当前时间算起的很长时间之后过期,比如DateTime。现在。加(相对)。
为什么说类似?
因为每个国家的时间可能不同,所以MSCache默认使用UTC时间。这个时间可以在选项里修改,后面会介绍。
滑动时间到期
除了前两次迭代满足2秒内命中缓存的要求外,其余三次迭代都不能满足2秒内命中缓存的要求,所以缓存项从第三次迭代开始失效。
自定义过期策略
很多时候,我们的缓存过期条件并不局限于时间。例如,我们缓存一个文件的内容,当文件发生变化时,我们需要重新加载文件来更新缓存。比如我们缓存用户信息,在一条总线上接收到用户信息的变化后,清空用户缓存,重新缓存用户。
MS为我们提供了一个非常简单的自定义过期策略。
MS使用接口IChangeToken来展示该过期策略。我们来看看IChangeToken。
IChangeToken
IChangeToken不完全是针对MS的,只是一个基础包中的接口,所以在理解这个接口的时候尽量不要把它带入缓存中考虑。
HasChanged,顾名思义,用于返回是否发生了变化。如果MSCache返回true,缓存条目将无效。
ActiveChangeCallbacks是一个有点玄学的属性,更多的是一种描述。字面意思是令牌是否会激活回调取决于IChangeToken实现者的逻辑。如果该值返回false,则当通过IChangeToken的RegisterChangeCallback发生更改时,不要期望回调通知。
RegisterChangeCallback注册一个回调,在发生变化时执行,通常用ActiveChangeCallbacks实现。
一个约束并不是强制
当ActiveCallbacks为true时,通过RegisterChangeCallback注册的回调将在发生更改时由回调执行,反之亦然。
由MS的其他组件实现的IChangeToken
CancellationChangeToken(cancellation token的包装)
CompositeChangeToken(组合ChangeToken,可以将多个ChangeToken包装成一个令牌)
ConfigurationReloadToken(配置ReloadToken,来自令牌MS.Configuration组件)
PollingFileChangeToken(通过轮转培训监视文件更改)
PollingWildCardChangeToken(通过轮转培训监视文件更改,支持通配符)
……
缓存一个文件,并在文件变化时候更新缓存内容
手动过期缓存
ChangeToken的一次性
嗯,适当的输出1 1 2 2?
实际输出结果1 1 2 3
为什么?
如前所述,ChangeToken通过HasChanged来确定缓存是否过期。
在这一边,我们称之为取消cts,所以随后的HasChanged无论如何都是真的,因为cts的取消是不可逆的。
正确的做法
这里正确的做法是强调ChangeToken是一次性事件,如何实现这个目标你可以自由发挥。
自定义一个ChangeToken,当当前时间的分数为偶数时候过期
过期策略组合拳
上面介绍了MSCache中的过期策略,但是都是单独使用的。事实上,这些过期策略可以混合使用。
例如,指定1小时后过期或10分钟内未命中过期。
IChangeToken当然是可以的。
这里的过期策略是,只要满足开始条件,这个缓存就无效。
缓存过期回调
很多时候我们想在缓存过期后做一些事情,比如重写缓存等。MSCache提供了这样一种机制。
使用回调相关的定义
示例
写在最后
想想这段代码为什么没有回调输出。
本文主要谈谈在MSCache中使用和扩展缓存过期的几种方法。下一篇文章会介绍MSCache中的一些操作机制,比如为什么上面的代码没有输出?如何清除一组缓存等等。希望对大家的学习有帮助,也希望大家多多支持。