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
英文地址,請注明出處:http://en.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…