0

0

.NET中的内存缓存(MemoryCache)是什么?如何为应用添加本地缓存?

月夜之吻

月夜之吻

发布时间:2025-11-28 18:25:02

|

976人浏览过

|

来源于php中文网

原创

MemoryCache是.NET中的进程内缓存机制,通过在应用程序内存中存储数据以提升性能。它属于Microsoft.Extensions.Caching.Memory命名空间,支持ASP.NET Core、控制台应用等多种场景。与分布式缓存不同,MemoryCache仅限当前实例使用,重启后数据丢失,多节点部署时存在不一致性。使用时需先在Program.cs中注册AddMemoryCache()服务,再通过依赖注入IMemoryCache接口进行操作。常用方法包括TryGetValue、Set、Remove以及GetOrCreate。可设置绝对过期或滑动过期策略来控制缓存生命周期,系统还会在内存压力高时自动清理。合理设计缓存键和过期时间可避免脏数据与内存溢出,显著提升应用响应速度。

.net中的内存缓存(memorycache)是什么?如何为应用添加本地缓存?

.NET 中的 MemoryCache 是一个在应用程序运行时将数据存储在内存中的本地缓存机制。它允许你将频繁访问或计算开销较大的数据保存在内存中,从而减少数据库查询、文件读取或远程服务调用的次数,提升应用性能。

MemoryCache 是 .NET Framework 和 .NET Core/.NET 5+ 都支持的功能,属于 Microsoft.Extensions.Caching.Memory 命名空间,适用于 ASP.NET Core、控制台应用、Windows 服务等需要本地缓存的场景。

MemoryCache 的特点

它不是分布式缓存(如 Redis),而是进程内缓存,仅限当前服务器实例使用。这意味着:

  • 速度快,数据直接在内存中读写
  • 重启应用后数据丢失
  • 多服务器部署时各节点缓存不一致
  • 适合存储与当前实例相关的临时数据

如何为应用添加 MemoryCache

以 ASP.NET Core 项目为例,添加和使用 MemoryCache 分为以下几个步骤:

1. 安装依赖包(.NET 6 及以下可能需要)

大多数新版本已内置,但若提示找不到命名空间,可安装:

Microsoft.Extensions.Caching.Memory

2. 在 Program.cs 中注册服务

在依赖注入容器中添加 MemoryCache 支持:

VWO
VWO

一个A/B测试工具

下载
var builder = WebApplication.CreateBuilder(args);

// 添加 MemoryCache 服务
builder.Services.AddMemoryCache();

var app = builder.Build();

3. 在控制器或服务中使用 IMemoryCache

通过构造函数注入 IMemoryCache 接口,进行缓存操作:

using Microsoft.Extensions.Caching.Memory;

public class WeatherController : ControllerBase
{
    private readonly IMemoryCache _cache;

    public WeatherController(IMemoryCache cache)
    {
        _cache = cache;
    }

    public IActionResult GetForecast()
    {
        const string cacheKey = "weather_forecast_2025";

        // 尝试从缓存获取数据
        if (!_cache.TryGetValue(cacheKey, out List forecast))
        {
            // 缓存未命中:生成数据(例如查数据库)
            forecast = GenerateWeatherData();

            // 设置缓存选项
            var cacheEntryOptions = new MemoryCacheEntryOptions()
                .SetAbsoluteExpiration(TimeSpan.FromMinutes(30)) // 30分钟后过期
                .SetSlidingExpiration(TimeSpan.FromMinutes(10)); // 10分钟内访问则延长

            // 写入缓存
            _cache.Set(cacheKey, forecast, cacheEntryOptions);
        }

        return Ok(forecast);
    }
}

4. 常用缓存操作说明

  • TryGetValue:尝试获取缓存项,返回布尔值表示是否存在
  • Set:设置缓存值和过期策略
  • Remove:手动删除某个键的缓存
  • GetOrCreate / GetOrCreateAsync:更简洁的方式,自动处理“获取或创建”逻辑

例如使用 GetOrCreate:

var forecast = _cache.GetOrCreate(cacheKey, entry =>
{
    entry.SetAbsoluteExpiration(TimeSpan.FromMinutes(30));
    return GenerateWeatherData();
});

缓存过期策略建议

合理设置过期时间对缓存有效性至关重要:

  • 绝对过期(Absolute Expiration):固定时间后失效,适合定时更新的数据
  • 滑动过期(Sliding Expiration):每次访问刷新过期时间,适合热点数据
  • 可同时设置两者,系统会取更早触发的条件

MemoryCache 会在内存压力大时自动清理部分条目,因此不能依赖其长期保存数据。

基本上就这些。只要注册服务并注入接口,就能快速为应用加上本地缓存能力,显著提升响应速度。关键是根据业务选择合适的缓存键和过期策略,避免脏数据或内存溢出。

相关专题

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

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

325

2023.08.11

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

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

232

2023.10.07

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1023

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

66

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

429

2025.12.29

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

578

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1103

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

792

2023.08.01

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

71

2026.01.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.4万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号