当前位置: 首页 > news >正文

拥抱.NET Core系列:MemoryCache 缓存选项

在上一篇 ”拥抱.NET Core系列:MemoryCache 缓存过期” 中我们详细的了解了缓存过期相关的内容,今天我们来介绍一下 MSCache 中的 Options,由此来介绍一些 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

MemoryCacheOptions

image

Clock 顾名思义,是用来提供时间的一个成员,缓存里面大量用到了时间来判断缓存是否过期。

CompactOnMemoryPressure 已经被废弃,可以不用管

ExpirationScanFrequency 过期扫描频率(默认为1分钟,可以理解为每过多久移除一次过期的缓存项)

SizeLimit 缓存大小限制(这属于一个说明性属性,而且单位也不是缓存数目,而是缓存真正占用的空间大小)

CompactionPercentage 压缩率(默认0.05,百分比)

Clock

初次见到的时候以为是用来自定义 LocalTime,其实不是(当然要这么做也可以),在 MSCache 中只允许用 Utc 时间,但是为什么既然都是 Utc 时间还要留这个扩展选项呢?

很简单,默认的当前时间是当前系统的当前时间,在一些对时间精度要求比较高的情况下就可以重写 Clock 来实现自己自定义的获取当前时间的逻辑。

ExpirationScanFrequency

缓存无非是一个字典表,当一些缓存项过期失效时候我们需要移除字典表里面的内容。

然而准确的做到每个缓冲项过期就进行移除是非常损失性能的(类似GC),所以 MSCache 提供了一个属性来设置,没间隔多久才进行一次过期缓存移除。

这个值默认为1分钟。

什么时候会进行过期缓存清理?

  1. 添加新的
  2. 获取缓存项
  3. 删除缓存项目
  4. 当有缓存项过期(通过过期回调)

这边就解释了上一节的最后为什么没有回调输出。

因为MSCache里面没有使用定时器来进行过期扫描。

ps:缓存过期清理是一个异步方法也就是不会堵塞当前线程。

SizeLimit

这个属性在 MemoryCache 中几乎没有用,在 MemoryCache 中关于缓存项的大小默认都是null或0。

因为这个属性并不是缓存项的数量,而是缓存真正占用的空间大小,如这个缓存项占用了多少内存。

然而在.NET中计算一个对象所占用的内存是很难且损耗性能的,所以在 MemoryCache 中这个属性几乎可以看做没有。

当然你可以通过手动设置缓存项的Size来启用相关功能。这边我们只简单说明,详细讲解会在后面的分布式缓存中进行说明。

这个属性的作用是:当所有缓存大小超过这个值的时候进行一次缓存压缩。

CompactionPercentage

当内存大小超过 SizeLimit 时候进行压缩的比率,默认值是0.05,也就是百分之5。

具体的计算方式是

得到剩余的缓存大小 SizeLimit * 1 – CompactionPercentage

得到需要压缩的大小 CurrentSize  –  (SizeLimit * 1 – CompactionPercentage)

缓存的清理优先级

image

这时候就牵扯到 CacheEntry 中的 Priority 属性了,当发生这种情况的时候 MSCache 会按以下优先级进行压缩处理

  1. Low
  2. Normal
  3. High

为什么没有  NeverRemove ?因为 NeverRemove 永远不会在超过 SizeLimt 时候进行清理。

那么当缓存大小超过SizeLimit时,MSCache会

先清理Low优先级的缓存项(不管是否过期)

再清理Normal优先级的缓存项(不管是否过期)

继续清理High优先级的缓存项(不管是否过期)

CacheEntry 默认的 优先级为:Normal。

写在最后

今天介绍了一些 MSCache 的内部机制,后续会讲一下 缓存域 和 一些小技巧。

.NET技术栈QQ群:384413261(点击加入 .NET Group)

相关文章:

  • 树莓派打造无线扫描仪.
  • 用“世界上最好的编程语言”制作的敲诈者木马揭秘
  • Docker容器部署时区问题的坑
  • 【转】Tesla Model S的设计失误
  • JavaScript 奇技淫巧
  • 测试经验1_2016-2017
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • EF Core:一统SQL和NoSQL数据库
  • linux----------fedora 27 如何启用输入法
  • 蠢蠢欲动的跳槽季
  • 十二周二次课
  • 【面试题】2018年最全Java面试通关秘籍汇总集!
  • Win8Metro(C#)数字图像处理--2.18图像平移变换
  • 银行卡号编码规则
  • iOS开发:瀑布流效果的实现(使用UICollectionView)
  • 2017前端实习生面试总结
  • Angular4 模板式表单用法以及验证
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • input实现文字超出省略号功能
  • laravel5.5 视图共享数据
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Linux中的硬链接与软链接
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Rancher-k8s加速安装文档
  • springMvc学习笔记(2)
  • spring学习第二天
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 码农张的Bug人生 - 见面之礼
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 硬币翻转问题,区间操作
  • 原生js练习题---第五课
  • python最赚钱的4个方向,你最心动的是哪个?
  • 昨天1024程序员节,我故意写了个死循环~
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (33)STM32——485实验笔记
  • (javascript)再说document.body.scrollTop的使用问题
  • (二)Linux——Linux常用指令
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (十六)串口UART
  • (五)网络优化与超参数选择--九五小庞
  • (一一四)第九章编程练习
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net 调用php,php 调用.net com组件 --
  • .net6使用Sejil可视化日志
  • .NET建议使用的大小写命名原则
  • .net网站发布-允许更新此预编译站点
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149