惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
T
Tailwind CSS Blog
Microsoft Azure Blog
Microsoft Azure Blog
The Cloudflare Blog
博客园 - 叶小钗
N
Netflix TechBlog - Medium
罗磊的独立博客
量子位
MyScale Blog
MyScale Blog
A
About on SuperTechFans
Blog — PlanetScale
Blog — PlanetScale
V
Visual Studio Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
GbyAI
GbyAI
B
Blog
腾讯CDC
爱范儿
爱范儿
Recent Announcements
Recent Announcements
有赞技术团队
有赞技术团队
F
Fortinet All Blogs
雷峰网
雷峰网
G
Google Developers Blog
Google DeepMind News
Google DeepMind News

博客园 - 华安

自适应网格系统:CSS Grid中repeat()、auto-fill与auto-fit的深度解析 CSS3中响应式布局两大神器display:flex和display:grid springBoot中的 pom.xml文件 bulid学习 CSS中元素的display显示方式有多种,隐藏、块级、内联、内联-块级 SQl Server 中的 go 是什么作用 CSS中 display:flex的align-items: stretch; 移动端浏览器(尤其是 iOS Safari)的橡皮筋回弹效果(Overscroll / Bounce Effect) 手机端浏览器上ES6中的Fetch回调执行 window.open没效果 用Flex实现兼容性好的全屏布局 在 VS Code 中使用 C# Dev Kit 和 Unity Tools 调试 Unity 2022 Unity 可编程物件(ScriptableObject) 微信小程序中的 联系客服 最基本的使用方法 wx.requestSubscribeMessage(Object object) 和 wx.requestSubscribeDeviceMessage(Object object) 这两个有什么区别 微信小程序中 wx.hideLoading() 后调用 wx.showToast()的问题 Windows 中启动 Nginx的常用命令 CSS进阶技巧:字体渐变、描边、倒影与渐变色描边全解析 netCore 中各DLL引用了 SkiaSharp.dll的问题 unity中预制体解包 在 Unity 中,Time.timeScale实现游戏暂停加速等 微信小程序中关联微信支付 unity中的 Navigation AI使用 C#中TaskCompletionSource(简称 TCS)学习 Unity 编辑器 中,快捷键 Ctrl + Shift + F 的功能 unity中按下 F键,让物体聚焦 微信中进入定页面的,判断时通过扫二维码进入的,还是点小程序名称进入的 MYSQL中从JSON字符串中提取指定的值 Unity2022中创建动画 Animation(旧方法) Unity 中区别,public 和 [SerializeField] Unity中 onCollisionEnter2D与OnTriggerEnter2D 区别 asp.netCore中给动态请求路径加客户端缓存
C#中Microsoft.Extensions.Caching.Memory 与 System.Runtime...
华安 · 2026-09-17 · via 博客园 - 华安

Microsoft.Extensions.Caching.MemorySystem.Runtime.Caching.MemoryCache 都是.NET中的内存缓存实现,但它们的设计初衷、演进背景、使用场景和定位都有明显区别。总结如下:

一、基本区别

特性System.Runtime.Caching.MemoryCacheMicrosoft.Extensions.Caching.Memory (IMemoryCache)
命名空间 System.Runtime.Caching Microsoft.Extensions.Caching.Memory
首次出现 .NET Framework 4.0 ASP.NET Core 1.0 (随 .NET Core 推出)
主要面向 传统的 .NET Framework 应用 跨平台的 .NET Core / ASP.NET Core 应用
是否跨平台 不完全跨平台(主要支持 Windows) 完全跨平台 (.NET Core 及以后版本跨Windows、Linux、macOS)
默认缓存实例 使用 MemoryCache.Default 单例 需要自己创建实例或通过DI注入
配置复杂度 功能强大,支持多种策略、缓存优先级、内存压力管理等 设计轻量简单,易于拓展
依赖关系 依赖 Windows 组件,如 Memory Management 纯托管,无外部依赖

二、为什么有两个?为什么不统一?

1. .NET 演进与跨平台需求

  • System.Runtime.Caching.MemoryCache 是为 .NET Framework 设计,早期只支持 Windows 平台,依赖 Windows API 实现复杂缓存管理和回收,适合桌面应用和传统服务器应用。
  • 随着 .NET Core 的出现和跨平台战略,微软设计了 Microsoft.Extensions.Caching.Memory,完全由托管代码实现,易于跨平台使用,适配现代的轻量级 web 和云原生应用。

2. 设计理念不同

  • System.Runtime.Caching 设计复杂,提供丰富的缓存过期机制、内存压力响应回收策略等,功能偏向完整的企业级缓存中间件。
  • Microsoft.Extensions.Caching.Memory 更注重简单易用、灵活可扩展,集成在 .NET Core 的依赖注入(DI)和配置体系中。

3. 生态和使用场景分离

  • System.Runtime.Caching.MemoryCache 仍在一些传统 .NET Framework 应用中使用广泛,特别是需要依赖 Windows 特性的场景。
  • Microsoft.Extensions.Caching.Memory 是 ASP.NET Core 的“官方”缓存实现,推荐用于新开发、跨平台、微服务、Cloud Native 的场景。

三、具体差异示例

特性System.Runtime.Caching.MemoryCacheMicrosoft.Extensions.Caching.Memory
过期设置 通过 CacheItemPolicy.AbsoluteExpiration 通过 MemoryCacheEntryOptions.SetAbsoluteExpiration
失效回调 CacheEntryRemovedCallback MemoryCacheEntryOptions.RegisterPostEvictionCallback
支持优先级、内存压力感知 支持(高、中、低等优先级和内存压力驱动回收) 没有内存压力感知,手动控制或结合其他机制
多缓存实例管理 支持通过不同名字创建多个 MemoryCache 实例 缺省只有创建自己实例或依赖注入管理
支持文件依赖、监视变更? 支持文件依赖和 ChangeMonitors 支持通过 IChangeToken 实现
性能 较重,功能齐全

高性能,轻量级

四、总结

选择指南
新项目(尤其 .NET Core / .NET 5+)推荐使用 Microsoft.Extensions.Caching.Memory
它更加轻量、跨平台,集成简便,适合现代应用。
传统 .NET Framework 项目且需要更复杂缓存策略时,可以使用 System.Runtime.Caching.MemoryCache
如需内存压力响应机制或兼容老代码。

五、参考

如果你的应用代码是基于 ASP.NET Core 或需要跨平台,建议使用 Microsoft.Extensions.Caching.Memory。如果是老的 .NET Framework 应用,可继续用 System.Runtime.Caching.MemoryCache