ASP.NET Core Web API 内存缓存(IMemoryCache)入门指南

在 Web API 开发中,频繁访问数据库或第三方服务可能会带来性能瓶颈。为了提升接口响应速度并减轻后端压力,使用缓存是非常有效的优化手段

本文将带你快速上手 ASP.NET Core 提供的内存缓存(IMemoryCache),无需安装额外库,轻量、简单、适合中小项目


什么是 IMemoryCache?

IMemoryCache 是 ASP.NET Core 自带的缓存机制,使用服务器内存来存储数据对象,单机部署即可使用,无需 Redis 等中间件

它非常适合以下场景:

  • 中小型项目

  • 单台服务器部署

  • 临时性或短期缓存需求(如列表页缓存、字典表缓存)


一. 启用缓存服务

IMemoryCache 默认已包含在 ASP.NET Core 中,仅需在 Program.cs 注册:

builder.Services.AddMemoryCache();

二. 在 Controller 或 Service 中使用缓存

以下是一个简单的控制器示例,缓存产品列表 5 分钟:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;[ApiController]
[Route("api/[controller]")]
public class ProductController : ControllerBase
{private readonly IMemoryCache _cache;public ProductController(IMemoryCache cache){_cache = cache;}[HttpGet("GetAll")]public IActionResult GetAll(){const string cacheKey = "product_list";// 尝试从缓存中读取if (_cache.TryGetValue(cacheKey, out List<string> cachedProducts)){return Ok(new { fromCache = true, data = cachedProducts });}// 模拟从数据库读取数据var productsFromDb = new List<string> { "Apple", "Banana", "Orange" };// 设置缓存项(滑动过期 5 分钟)var cacheOptions = new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromMinutes(5));_cache.Set(cacheKey, productsFromDb, cacheOptions);return Ok(new { fromCache = false, data = productsFromDb });}
}

三. IMemoryCache接口

IMemoryCache接口是ASP.NET Core 中用于本地内存缓存的核心接口,位于命名空间Microsoft.Extensions.Caching.Memory 下。

它本质上是一个轻量级的、线程安全的键值对缓存容器,你可以通过它来存取缓存项,而不需要关心底层缓存机制的实现。

下面是对它各个成员的详细讲解:


1.bool TryGetValue(object key, out object? value)

(1) 用途

尝试从缓存中获取一个键对应的值。

(2) 用法
if (_memoryCache.TryGetValue("product_list", out var value))
{// value 是 object 类型,通常你需要强制转换一下var products = value as List<Product>;
}
(3) 说明
  • 如果 key 存在于缓存中,则返回 true,并将其值赋给 value

  • 如果不存在,返回 falsevaluenull


2.ICacheEntry CreateEntry(object key)

(1) 用途

创建一个新的缓存项,或更新已有项。

(2) 用法(不常用,推荐用 .Set() 封装版本)
var entry = _memoryCache.CreateEntry("product_list");
entry.Value = new List<string> { "Apple", "Banana" };
entry.SlidingExpiration = TimeSpan.FromMinutes(5);
entry.Dispose(); // 必须手动 Dispose,否则不会生效!

注意:CreateEntry() 返回的是一个 ICacheEntry,需要 Dispose() 才能提交。通常你不需要直接用这个方法,而是使用更方便的 Set() 方法(实际上它内部就是调用了这个方法并自动处理)。


3.void Remove(object key)

(1) 用途

显式移除某个缓存项。

(2) 用法
_memoryCache.Remove("product_list");
(3) 场景
  • 数据更新时主动清除旧缓存

  • 控制缓存大小

  • 用户退出登录后清除用户相关缓存


4.MemoryCacheStatistics? GetCurrentStatistics()

(1) 用途

获取当前缓存的统计数据(如命中率、条目数等)。

(2) 用法
var stats = _memoryCache.GetCurrentStatistics();
if (stats != null)
{Console.WriteLine($"Entries: {stats.CurrentEntryCount}, Hits: {stats.TotalHits}");
}

仅在启用了统计时才有意义,在默认 MemoryCacheOptions 下此功能为 关闭状态

上述成员我们一般不会使用,donet有更高级的封装给我们使用! 


5.常配套的扩展方法(推荐使用

虽然 IMemoryCache 提供了上述原始 API,但大多数开发者会用这些 更方便的扩展方法(定义在 MemoryCacheExtensions 类中):

Set 方法(创建或更新)
_memoryCache.Set("product_list", data, TimeSpan.FromMinutes(5));
Get<T> 方法(读取)
var list = _memoryCache.Get<List<string>>("product_list");
GetOrCreate 方法(读取或创建)

这个方法是最推荐使用的,先尝试从缓存获取,如果缓存没有那么回调方法里面再从数据库里面查找,

如果数据库没有别忘了抛出异常,避免缓存null

var result = _memoryCache.GetOrCreate("product_list", entry =>
{entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5);return GetProductsFromDb(); // 如果没缓存,就调用这个方法
});

6.总结

IMemoryCache 是 ASP.NET Core 中的本地缓存接口,提供最基本的存取能力(TryGetValue、CreateEntry、Remove)和可选统计功能(GetCurrentStatistics),但推荐使用其扩展方法 SetGetGetOrCreate 来更高效地完成常规缓存需求。


四. 缓存策略说明

MemoryCacheEntryOptions 提供了多种配置方式:

方法说明
SetSlidingExpiration如果缓存一段时间内没被访问就自动过期
SetAbsoluteExpiration缓存数据在指定时间后无论如何都过期
SetPriority设置缓存项在清除时的优先级
RegisterPostEvictionCallback缓存被移除时触发回调函数

五. 使用注意事项

  • 只适用于单机,如果你使用的是集群或容器化部署,请考虑分布式缓存(如 Redis)。

  • 缓存 key 应该具有唯一性,避免与其他模块冲突。

  • 不要缓存过大的数据,避免内存膨胀。

  • 对于会频繁更新的数据,需做好缓存失效机制设计


六. 建议:封装为服务层缓存逻辑

为避免控制器代码臃肿,推荐将缓存逻辑封装进服务类中,控制器只负责返回结果。

public class ProductService
{private readonly IMemoryCache _cache;public ProductService(IMemoryCache cache){_cache = cache;}public List<string> GetAllProducts(){if (_cache.TryGetValue("product_list", out List<string> products))return products;var list = new List<string> { "Apple", "Banana", "Orange" };_cache.Set("product_list", list, TimeSpan.FromMinutes(5));return list;}
}

七. 总结

优点缺点
快速、轻量仅支持单节点
使用简单数据丢失风险(如进程重启)
零依赖不适合大规模持久缓存

对于中小型的 Web API 项目,IMemoryCache 是一个非常合适的选择。在性能与复杂度之间取得平衡,能让你在几行代码内大幅提升响应速度!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915679.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Axios Token 设置示例

以下是一个完整的 Axios Token 设置示例&#xff0c;涵盖全局配置、请求拦截器和单次请求设置三种方式&#xff1a;1. 基础配置&#xff08;推荐方案&#xff09;javascript复制代码import axios from axios;// 创建 Axios 实例 const apiClient axios.create({baseURL: https…

Excel数据合并工具:零门槛快速整理

软件介绍 在数据处理工作中&#xff0c;合并Excel同类数据是一项常见但繁琐的任务。今天为大家推荐一款专为简化此类操作设计的工具&#xff0c;它能快速完成工作表内多行同类数据的合并整理&#xff0c;大幅提升数据处理效率。 零门槛操作体验 相比Excel自带的数据透视…

深度学习 -- 梯度计算及上下文控制

深度学习 – 梯度计算及上下文控制 文章目录深度学习 -- 梯度计算及上下文控制一&#xff0c;自动微分1.1 基础概念1.2 计算梯度1.2.1 计算标量梯度1.2.2 计算向量梯度1.2.3 多标量梯度计算1.2.4 多向量梯度计算二&#xff0c;梯度上下文控制2.1 控制梯度计算2.2 累计梯度2.3 梯…

Redisson RLocalCachedMap 核心参数详解

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

【Unity3D实例-功能-移动】角色移动-通过WSAD(Rigidbody方式)

你是否曾梦想在虚拟世界中自由翱翔&#xff0c;像海豚一样在海洋自由穿梭&#xff0c;或者像宇航员一样在宇宙中尽情探索&#xff1f;今天&#xff0c;我们就来聊聊如何在Unity中使用Rigidbody来实现角色移动。 废话不多说&#xff0c;走&#xff0c;让我们马上来一探究竟&…

Vue接口平台学习十一——业务流测试

效果图及简单说明 与之前的用例列表相似布局&#xff0c;也分左右&#xff0c;左边用于显示测试流程的名称&#xff0c;右边用于显示流程相关信息。 左侧点击添加&#xff0c;直接增加一个新的业务流。 右侧是点击的业务流详情&#xff0c;展示名称&#xff0c;名称的编辑保存&…

碳化硅缺陷分类与原因

01一、碳化硅晶体材料中的缺陷到底是什么&#xff1f;碳化硅晶体材料中的缺陷是指在晶体生长、加工或使用过程中出现的不完美结构。这些缺陷可能表现为晶体内部的裂纹、表面的凹坑、原子排列的错误等。虽然缺陷看起来微不足道&#xff0c;但它们却可能对晶体的电学、热学和机械…

Jenkins 实现项目的构建和发布

作者&#xff1a;小凯 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01; 本文的宗旨在于通过简单干净实践的方式教会读者&#xff0c;如何在 Docker 中部署 Jenkins&#xff0c;并通过 Jenkins 完成对项目的打包构建并在 Docker 容器中部署。 Jenkins 的主要…

Django接口自动化平台实现(三)

3.2 后台 admin 添加数据 1&#xff09;注册模型类到 admin&#xff1a; 1 from django.contrib import admin2 from . import models3 4 5 class ProjectAdmin(admin.ModelAdmin):6 list_display ("id", "name", "proj_owner", "tes…

CentOS 7 配置环境变量常见的4种方式

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

k8s:手动创建PV,解决postgis数据库本地永久存储

1.离线环境CPU:Hygon C86 7285 32-core Processor 操作系统&#xff1a;麒麟操作系统 containerd&#xff1a;1.7.27 Kubernetes:1.26.12 KubeSphere:4.1.2 kubekey&#xff1a;3.1.10 Harbor:2.13.1 Postgis:17-3.52创建StorageClass2.1创建 apiVersion: storage.k8s.io/v1kin…

谷歌浏览器Chrome的多用户配置文件功能

谷歌浏览器Chrome的多用户配置文件功能允许在同一设备上创建多个独立账户,每个账户拥有完全隔离的浏览数据(如书签、历史记录、扩展、Cookies等),非常适合工作/生活账户分离、家庭共享或临时多账号登录场景。 如何使用Chrome的多用户配置文件功能? 一、创建与切换用户 1.…

傲软录屏 专业高清录屏软件 ApowerREC Pro 下载与保姆级安装教程!!

小编今天分享一款强大的电脑屏幕录像软件 傲软录屏 ApowerREC&#xff0c;能够帮助用户录制中电脑桌面屏幕上的所有内容&#xff0c;包括画面和声音&#xff0c;支持全屏录制、区域录制、画中画以及摄像头录制等多种视频录制模式&#xff0c;此外&#xff0c;还支持计划任务录制…

【计算机网络】MAC地址与IP地址:网络通信的双重身份标识

在计算机网络领域&#xff0c;MAC地址与IP地址是两个核心概念&#xff0c;它们共同构成了数据传输的基础。理解二者的区别与联系&#xff0c;对于网络配置、故障排查及安全管理至关重要。 一、基本概念 1. MAC地址&#xff08;物理地址&#xff09; 定义&#xff1a;固化在网络…

如何用keepAlive实现标签页缓存

什么是KeepAlive首先&#xff0c;要明确所说的是TCP的 KeepAlive 还是HTTP的 Keep-Alive。TCP的KeepAlive和HTTP的Keep-Alive是完全不同的概念&#xff0c;不能混为一谈。实际上HTTP的KeepAlive写法是Keep-Alive&#xff0c;跟TCP的KeepAlive写法上也有不同。TCP的KeepAliveTCP…

数据库隔离级别

隔离级别决定了事务之间的可见性规则&#xff0c;直接影响数据库的并发性能和数据一致性。SQL 标准定义了 4 种隔离级别&#xff0c;从低到高依次为&#xff1a;读未提交→读已提交→可重复读→串行化。隔离级别越高&#xff0c;对并发问题的解决能力越强&#xff0c;但对性能的…

基于Python flask的电影数据分析及可视化系统的设计与实现,可视化内容很丰富

摘要&#xff1a;基于Python的电影数据分析及可视化系统是一个应用于电影市场的数据分析平台&#xff0c;旨在为广大电影爱好者提供更准确、更详细、更实用的电影数据。数据分析部分主要是对来自猫眼电影网站上的数据进行清洗、分类处理、存储等步骤&#xff0c;数据可视化则是…

TCP通讯开发注意事项及常见问题解析

文章目录一、TCP协议特性与开发挑战二、粘包与拆包问题深度解析1. 成因原理2. 典型场景与实例验证3. 系统化解决方案接收方每次读取10字节2. 丢包检测与验证工具3. 工程化解决方案四、连接管理关键实践1. 超时机制设计2. TIME_WAIT状态优化3. 异常处理最佳实践五、高性能TCP开发…

2021 RoboCom 世界机器人开发者大赛-本科组(复赛)解题报告 | 珂学家

前言 题解 睿抗机器人开发者大赛CAIP-编程技能赛-历年真题 汇总 2021 RoboCom 世界机器人开发者大赛-本科组&#xff08;复赛&#xff09;解题报告 感觉这个T1特别有意思&#xff0c;非典型题&#xff0c;着重推演下结论。 T2是一道玄学题&#xff0c;但是涉及一些优化技巧…

《计算机“十万个为什么”》之 MQ

《计算机“十万个为什么”》之 MQ &#x1f4e8; 欢迎来到消息队列的奇妙世界&#xff01; 在这篇文章中&#xff0c;我们将探索 MQ 的奥秘&#xff0c;从基础概念到实际应用&#xff0c;让你彻底搞懂这个分布式系统中不可或缺的重要组件&#xff01;&#x1f680; 作者&#x…