You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于services.AddMemoryCache()调用时机及缓存数据生命周期的问询

内存缓存中间件相关问题解答

我正在编写一款可借助内存缓存优化性能的中间件,目前通过依赖注入获取IMemoryCache实例,代码如下:

public async Task Invoke(HttpContext context, UserManager<ApplicationUser> userManager, IMemoryCache cache)
{
    // Access cache here...
}

当前代码可正常运行,但存在两个疑问:

问题1:services.AddMemoryCache()的作用是什么?何时需要调用它?

  • 核心作用:这个方法负责把内存缓存服务注册到依赖注入容器,将IMemoryCache接口和它的默认实现MemoryCache绑定,同时可以配置缓存的默认行为(比如缓存容量上限、过期数据扫描频率等)。
  • 未调用仍能运行的原因:在ASP.NET Core的多数场景下,框架已经帮你隐式调用了这个方法。比如使用MVC、Razor Pages或者某些内置中间件时,模板会自动引入并注册内存缓存服务,所以你不用手动加也能拿到实例。
  • 手动调用的场景:
    1. 如果你是从零搭建的极简空项目(仅基础Web主机,无MVC等依赖),必须手动调用才能让DI容器提供IMemoryCache实例。
    2. 需要自定义缓存配置时,比如设置缓存最大容量、调整过期扫描间隔,这时候要通过AddMemoryCache()传入配置参数,示例:
    services.AddMemoryCache(options =>
    {
        options.SizeLimit = 1024 * 1024; // 限制缓存占用内存大小
        options.ExpirationScanFrequency = TimeSpan.FromMinutes(5); // 每5分钟扫描一次过期数据
    });
    

问题2:存储在内存缓存中的数据的生命周期是怎样的?

内存缓存数据的生命周期由以下几个因素控制:

  • 自定义过期规则:存数据时可以设置两种过期方式:
    • 绝对过期:指定一个具体时间,到点就自动删除缓存,比如cache.Set(key, value, DateTimeOffset.Now.AddHours(1))。
    • 滑动过期:如果数据在指定时长内没有被访问,就会被移除;一旦被访问,过期时间就会重置,比如cache.Set(key, value, new MemoryCacheEntryOptions { SlidingExpiration = TimeSpan.FromMinutes(10) })。
  • 内存自动回收:当服务器内存不足时,缓存会启动LRU(最近最少使用)策略,自动删除最少被访问的缓存数据,释放内存空间。
  • 手动移除:可以通过cache.Remove(key)主动删除指定键的缓存数据。
  • 进程生命周期绑定:内存缓存是进程内缓存,数据存在当前应用的进程内存里。一旦应用重启、进程回收或者服务器重启,所有缓存数据都会丢失。

内容的提问来源于stack exchange,提问作者Jonathan Wood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:22:22