内存缓存的域 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
缓存域
让我们假设一个场景。有以下四名成员
图书模型(包括一组章节模型)章节模型图书服务章节服务
图书服务有一种获取书籍的方法
ChapterService有一个获取书籍章节的方法
可以看到缓存在GetBook中使用,缓存了5秒。GetBook再次调用了ChapterService的GetChapters,缓存了3秒。
此时图书的章节信息缓存早于图书的到期时间。
那么想象一下,如果章节信息先过期,GetBook会返回旧数据吗?
在一些简单的缓存设计中确实如此,但是微软在MSCache中提供了缓存域的概念,Chapter的父级缓存是分层的Book。因此,当章到期时,书将会级联出来。
让我们来看看测试。
可以看到,不仅每三秒重新获取一次章节,连Book也一起重新获取。
这大大减少了处理缓存依赖的问题。
ChaneToken在域中
SlidingExpiration在域中(突出显示)
输出是时间,时间和新时间。
实际上?
子缓存条目尚未过期。
这是为什么?我搜索了cache的源代码,发现在cache失效扩散的过程中,我们没有处理SlidingExpiration,只处理ExpirationTokens和AbsoluteExpiration。
我不知道这是不是bug,但是我已经在MSCache项目上提出了一个问题,等待回复后会更新这一块的描述。
该件的加工代码如下:
逻辑很简单,它自己的过期令牌和绝对过期时间是在父缓存项上设置的。
也就是说,您在父缓存中设计的绝对到期时间将被重写为到期缓存字段中的最小到期时间。
写在最后
MSCache真的很像果园缓存。感兴趣的学生可以了解一些果园缓存设计。至此,基本介绍了MSCache中的MemoryCache机制和功能。
稍后,我们将继续介绍MSCache中的分布式缓存,以及使用MSCache的一些技巧。
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
版权声明:内存缓存的域 NET核心系列是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。