手机版

内存缓存过期 NET核心系列

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

在前一篇文章“拥抱。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.nuget.org/packages/Microsoft.extensions.caching.memory/2.0.0

MSCache提供的过期方式

从源代码来看,MSCache提供了以下三种缓存过期方式

绝对到期(指定在固定时间点到期)滑动到期(如果在一段时间内未命中,则到期)到期令牌(用户定义的到期)

让我们逐一看看这些方法。

绝对时间到期

绝对到期很简单。MS提供了一个扩展的方法“SetAbsoluteExpiration”来设置绝对到期时间。

这里第一个方法定义中的relative表示它在当前时间之后过期,类似于DateTime。现在。添加(相对)。

为什么相似?

因为每个国家和地区的时间可能不一致,所以MSCache默认使用UTC时间,可以在选项中修改,后面会介绍。

滑动时间到期

除了前两次迭代满足2秒内命中缓存的要求,其余三次迭代无法满足2秒内命中缓存的要求,因此缓存条目将从第三次迭代开始过期。

自定义过期策略

在许多情况下,我们的缓存过期条件不仅仅是时间。例如,我们缓存一个文件的内容,当文件改变时需要重新加载文件更新缓存。另一个例子是,我们缓存用户信息,清除用户缓存,并在总线上接收到用户信息的变化后重新缓存用户。

MS为我们提供了一个非常简单的自定义过期策略。

移动台使用IChangeToken接口公开此过期策略。让我们来看看IChangeToken。

IChangeToken

IChangeToken并非完全为MS而生,而是基本包中的一个接口,所以在理解这个接口时尽量不要将其带入缓存。

HasChanged,顾名思义,用于返回是否发生了更改。如果在MSCache中返回true,则缓存项将变得无效。

ActiveChangeCallbacks是一个有点形而上学的属性,它更像是一种描述。从字面上看,这个令牌是否会激活回调取决于IChangeToken实现者的逻辑。如果该值返回false,不要期望在发生更改时使用IChangeToken的RegisterChangeCallback来实现回调通知。

RegisterChangeCallback注册一个回调,当发生更改时执行该回调,这通常是通过ActiveChangeCallbacks实现的。

约束不是强制性的

当activechange回调为真时,通过RegisterChangeCallback注册的回调将在发生更改时由回调执行,反之亦然。

IChangeToken由MS的其他组件实现

取消更改令牌(取消令牌的包装)

组合变更令牌可以将多个变更令牌打包到一个令牌中

配置重新加载令牌(配置重新加载令牌,来自令牌管理系统配置组件)

PollingFileChangeToken(通过循环训练监控文件更改)

PollingWildCardChangeToken(通过支持通配符的循环训练来监控文件更改)

……

缓存文件,并在文件更改时更新缓存内容

手动过期缓存

一次性更换令牌

嗯,合适的输出1 1 2 2?

实际输出结果1 1 2 3

为什么呢?

因为我们前面提到,ChangeToken使用HasChanged来判断缓存是否过期。

在这一点上,我们称之为cts的取消,所以HasChanged无论如何都是真的,因为cts的取消是不可逆的。

正确的方法

这里正确的做法是强调ChangeToken是一次性的,如何实现这个目标是大家可以自由发挥的。

自定义一个更改令牌,当当前时间的分数为偶数时,该令牌将过期

过期策略组合拳

上面介绍了MSCache中的过期策略,但它们都是单独使用的。事实上,这些过期策略可能是混合的。

例如,指定1小时后到期或10分钟内无命中到期。

IChangeToken当然是可能的。

这里的过期策略是,只要满足某个条件,缓存就无效。

缓存过期回调

很多时候我们希望在缓存过期后做一些事情,比如重写缓存等。MSCache提供了这样一种机制。

使用回调相关的定义

例子

写在最后

想想为什么这段代码中没有回调输出。

本文主要讨论在MSCache中使用和扩展缓存过期的几种方法。下一篇文章将介绍MSCache中的一些运行机制,比如为什么上面的代码没有输出。如何清除一组缓存等等。希望对大家的学习有帮助,希望大家多多支持我们。

版权声明:内存缓存过期 NET核心系列是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。