阅读目录

Cache是一个绝大多数项目会用到的一个技术,说起到缓存可能就联想到 Set、Add、Get、Remove、Clear 这几个方法。那么在.NET Core中微软给我们带来了什么样的缓存体验呢?今天我们就来介绍下”Microsoft.Extensions.Caching.Memory”。由于这个包名称过长,下文使用MSCache来代替

回到目录

MSCache能做什么?


  1. 绝对过期支持
  2. 滑动过期支持(指定一个时间,TimeSpan,指定时间内有被Get缓存时间则顺延,否则过期)
  3. 过期回调
  4. 自定义过期

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

回到目录

从IMemoryCache说起


IMemoryCache 就提供了三个方法并实现了 IDisposable 接口。
很好理解
CreateEntry 添加一个缓存
Remove 删除一个缓存,如果参数key对应的缓存不存在,Remove方法什么都不会做也不会报错,但是参数key为null,Remove方法会报错。
TryGetValue 获取一个缓存(并可得到具体的缓存是否存在)

ICacheEntry


ICacheEntry 有以上成员,同时实现了 IDisposable 接口,为什么要实现这个接口?用来释放缓存吗?这个在接下来的篇幅会做解释。
Key 缓存key
Value 缓存值
AbsoluteExpiration 绝对过期时间,为null则条件无效
AbsoluteExpirationRelativeToNow 相对当前时间的绝对过期时间(使用TimeSpan),为null条件无效
SlidingExpiration 滑动过期时间
ExpirationTokens 提供用来自定义缓存过期
PostEvictionCallbacks 缓存失效回调
Priority 缓存项优先级(在缓存满载的时候绝对清除的顺序)
Size 代表缓存数据的大小,在内存缓存中一般为null

我们来试试


恩,妥妥的,输出 “True” 和 “1”。

纳尼,居然是“False”和null。

玄学


有些同学可能已经注意到了 ICacheEntry 实现了IDisposable接口。为什么ICacheEntry要实现 IDisposable 接口呢?讲真我也不知道。反正大家知道它是具体像MemoryCache插入缓存的方法就行。
这有点违背了我们之前所学的 IDisposable 用来释放资源的原则。

正确的打开方式


回到目录

开发者的体验


说到底还不是 Set、Add、Get、Remove、Clear ?跟之前差不多啊。
MS团队提供了一个 CacheExtensions 扩展方法类

Get 比较好理解这边不多做累述。
Set 设置一个新的缓存条目(相同key的会被移除)就好像被set的这个key是一个完全新的东西,所以也不会继承之前的过期时间和过期token。

GetOrCreate


基本都用它,我们来看看。

两种方式 GetOrCreate 减少了第一种模式的判断。回调里面的entry就是ICacheEntry可以用来设置缓存的其它选项。
同时在这个Task满天飞的日子里,还提供了了 GetOrCreateAsync 扩展方法。

回到目录

写在最后


MSCache跟Orchard中的Caching非常的相识,或者说借鉴了Orchard中良好的Caching重构而来。
下一篇会主要介绍MSCache中的缓存过期机制。

原文链接

最新文章

  1. [LeetCode] Combination Sum II 组合之和之二
  2. IOS开发基础知识--碎片3
  3. ACM集训的1B。。。。黑色星期五。。。。2333333
  4. hdu5187 奇怪题
  5. MySql 5.7密码查看或修改
  6. 在Code First中使用Migrations对实体类和数据库做出变更
  7. VisualStudio2013&VS2015内置SQLServer入门 (三)
  8. How many ways(记忆化搜索)
  9. 微信小程序中不同页面间的参数传递
  10. 使用ScriptableObject创建.asset文件
  11. docker容器内存占用 之 系统cache,docker下java的内存该如何配置
  12. php多进程、IPC和事件驱动
  13. pytest十三:配置文件 pytest.ini
  14. Oracle分页查询排序数据重复问题
  15. php连接mysql...mysqli和mysql
  16. mysql存储过程之游标
  17. extjs_08_界面布局
  18. ffmpeg 编解码详细过程
  19. 课时56.marquee标签(理解)
  20. 密码本(无bug版)

热门文章

  1. 自己编写jQuery插件 之 放大镜
  2. Hadoop总结
  3. AE中IHookHelper的用法 来自http://blog.sina.com.cn/s/blog_6faf711d0100xs1x.html
  4. sql 单表查询练习
  5. centos7安装magento随记 这就是个坑,果断放弃
  6. node和iisnode express手工安装
  7. npm与gulp的使用
  8. 由delete导致的超时已过期问题
  9. 如何修改ionic中android程序的包名
  10. java虚拟机---内存