在 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
如果不存在,返回
false
,value
是null
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),但推薦使用其擴展方法Set
、Get
、GetOrCreate
來更高效地完成常規緩存需求。
四. 緩存策略說明
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
是一個非常合適的選擇。在性能與復雜度之間取得平衡,能讓你在幾行代碼內大幅提升響應速度!