讲师中心 微信公众号
AI工具推荐 视频效率加速

C#怎么使用MemoryCache进行缓存 .NET内存缓存使用教程

酷明酱_1328

酷明酱_1328

发布时间:2026-01-27 09:32:02

|

1019人浏览过

|

来源于php中文网

原创

MemoryCache 是 .NET 内置线程安全内存缓存,适用于单机高频读低频写场景;需通过 DI 注册和注入使用,支持绝对/滑动过期、优先级、淘汰回调等特性,但不支持自动刷新,且数据进程内有效、重启丢失。

c#怎么使用memorycache进行缓存 .net内存缓存使用教程

MemoryCache 是 .NET 内置的线程安全内存缓存组件,适用于单机应用中临时存储高频读、低频写的数据,比如配置项、字典表、API 响应结果等。它不依赖外部服务(如 Redis),开箱即用,但数据只存在于当前进程内存中,重启即丢失。

1. 引入命名空间并创建缓存实例

在 .NET 5+ 或 .NET Core 项目中,Microsoft.Extensions.Caching.Memory 已内置,无需额外安装 NuGet 包(旧版 .NET Framework 需手动安装 Microsoft.Extensions.Caching.Memory)。

推荐通过依赖注入使用缓存,而不是手动 new 实例 —— 这样能保证生命周期统一、线程安全且便于测试:

  • 在 Program.cs(.NET 6+)或 Startup.cs 中注册:

builder.Services.AddMemoryCache(); // 注册为单例服务
  • 在类中通过构造函数注入 IMemoryCache:
public class ProductService
{
    private readonly IMemoryCache _cache;
<pre class="brush:php;toolbar:false;">public ProductService(IMemoryCache cache)
{
    _cache = cache;
}

}

Microsoft Skill Creator
Microsoft Skill Creator

使用 Learn MCP 工具为 Microsoft 技术创建代理技能。当用户想要创建教授代理任何 Microsoft 技术的技能时使用。

下载

2. 存储与读取缓存项

MemoryCache 使用键值对方式操作,键必须是 object 类型(通常用 string),值任意类型。注意:键需全局唯一,建议加前缀避免冲突(如 "product:1001")。

  • 写入缓存(带过期策略):
_cache.Set("product:1001", product, new MemoryCacheEntryOptions()
    .SetAbsoluteExpiration(TimeSpan.FromMinutes(30))           // 30 分钟后绝对过期
    .SetSlidingExpiration(TimeSpan.FromMinutes(10))          // 10 分钟内无访问则过期
    .SetPriority(CacheItemPriority.Normal)                    // 优先级,内存紧张时决定淘汰顺序
    .RegisterPostEvictionCallback((key, value, reason, state) =>
    {
        Console.WriteLine($"缓存 {key} 因 {reason} 被移除");
    }));
  • 读取缓存(推荐用 TryGetValue,性能更好):
if (_cache.TryGetValue("product:1001", out Product? cachedProduct))
{
    return cachedProduct;
}
// 缓存未命中,查数据库并写入
var product = _db.Products.Find(id);
_cache.Set("product:1001", product, TimeSpan.FromMinutes(30));
return product;

3. 高级用法:自动刷新与弱引用场景

MemoryCache 不支持自动后台刷新(如定时重加载),但可通过封装 + 定时任务或“懒加载+滑动过期”模拟软刷新效果。

  • 避免缓存击穿:用 GetOrCreate 原子操作,确保同一键只执行一次工厂方法:
return _cache.GetOrCreate("config:site", entry =>
{
    entry.SetAbsoluteExpiration(TimeSpan.FromMinutes(5));
    return LoadSiteConfigFromDb(); // 此方法只会被调用一次(并发下也只一次)
});
  • 大对象注意:缓存大型对象(如大 byte[])可能引发 GC 压力,可考虑用 WeakReference 包装或改用文件/分布式缓存
  • 清理缓存:调用 _cache.Remove("key") 或 _cache.Compact(percentage: 50) 主动释放约 50% 占用空间(按优先级和过期时间估算)

4. 注意事项与常见坑

  • 缓存键不能为 null,否则抛异常;建议用 nameof + ID 组合生成键
  • 不要缓存 DbContext 实例、HttpContext、Controller 等有生命周期的对象 —— 会引发内存泄漏或异常
  • 默认最大缓存大小不限,但内存不足时会自动逐出(基于优先级+过期时间);如需硬性限制,可设置 SizeLimit 并配合 Size 选项
  • 在单元测试中,可用 new MemoryCache(new MemoryCacheOptions()) 创建轻量实例,无需 DI 容器

基本上就这些。MemoryCache 上手简单,关键在于合理设过期策略、避免缓存污染、不滥用大对象 —— 控制好这几点,日常业务缓存需求基本都能稳稳覆盖。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

2153

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

3554

2023.10.07

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7219

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4698

2023.08.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4849

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4415

2023.11.14

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn