在上一篇“《拥抱.NET Core系列:MemoryCache 缓存选项》”咱们介绍了一些 MSCache 的机制,今天咱们来介绍一下 MSCache 中的缓存域。html
MSCache 目前最新的正式版是 2.0.0,预览版是2.1.0,会与 .NETCore 2.1 一块儿发布。本篇用了2.0.0版本git
开源在 GitHub 上,仓库地址是:https://github.com/aspnet/Cachinggithub
NuGet地址为:https://www.nuget.org/packages/Microsoft.Extensions.Caching.Memory/2.0.0缓存
咱们来假设一个场景。分布式
有下面四个成员测试
BookService 有一个获取书籍的方法spa
ChapterService 有一个获取书籍章节的方法设计
能够看到 GetBook 内使用了缓存,缓存了5秒钟。GetBook 又调用了 ChapterService 的 GetChapters,GetChapters 缓存了3秒钟。3d
这时候书籍的章节信息缓存要早于书籍过时。htm
那么你们试想一下,若是章节信息先过时了 GetBook 这个方法返回的是否是仍是旧的数据?
在一些简单的缓存设计中是这样的,但在 MSCache 中微软提供了缓存域的概念,从层级上 Chapter 的父级缓存是 Book。因此当 Chapter 过时时,Book 也会级联过时。
咱们来看一下测试。
能够看到,每隔三秒钟不只 Chapter 从新获取,Book 也会一块儿级联获取。
这样在很大程度上减轻了咱们处理缓存依赖的问题。
恩,输出是 时间,时间,新时间。
其实呢?
子缓存项并无过时。
这是为何呢?我翻了 Caching 的源码发现,缓存失效扩散的处理中,并无对 SlidingExpiration 进行处理,只处理了 ExpirationTokens 和 AbsoluteExpiration。
不知道这是否是一个bug,我已经在 MSCache 项目上提了一个issue,等待回复后再来更新这块的说明。
这块的处理代码以下:
逻辑很简单,把自身的过时 token 和 绝对过时时间 设置在父缓存项上。
也就是说你在父缓存中设计的绝对到期时间会被改写成到期缓存域中最小的到期时间。
MSCache 真的很是像 Orchard 中的 Caching,有兴趣的同窗能够去了解一些 Orchard 中的 Caching 设计。
至 此 MSCache 中的 MemoryCache 机制和功能就基本介绍完了。
后续会继续介绍 MSCache 中的 DistributedCache(分布式缓存),和一些 MSCache 的使用技巧。
.NET技术栈QQ群:384413261(点击加入 .NET Group)