ASP.NET Core中使用LazyCache的全過程
前言
微軟的 ASP.NET Core 已經(jīng)是一個(gè)非常流行的用于構(gòu)建 高性能, 模塊化 并能運(yùn)行在 Windows, Linux, MacOS 上的 WEB 框架,通常能夠讓程序保持高性能的一個(gè)有效途徑就是通過緩存熱鏈上的數(shù)據(jù)來應(yīng)對(duì)高頻的請(qǐng)求。
LazyCache 是一款基于內(nèi)存的易于使用和線程安全的緩存組件,值得注意的是,這里的 Lazy 指的是 LazyCache 永遠(yuǎn)不會(huì)在 緩存未命中 時(shí)觸發(fā)一次以上的緩存委托函數(shù),因?yàn)閮?nèi)置了鎖,換句話說,Lazy 減少了不必要的計(jì)算開銷,這篇文章我們將會(huì)討論如何在 ASP.NET Core 5.0 中使用 LazyCache。
安裝 LazyCache
要想在 ASP.NET Core MVC 5 中使用 LazyCache,你需要安裝如下兩個(gè) nuget 包。
- LazyCache
- LazyCache.AspNetCore
你可以通過 Nuget 可視化工具安裝或者通過如下命令進(jìn)行安裝。
PM> Install-Package LazyCache
PM> Install-Package LazyCache.AspNetCore
為什么要緩存?
緩存是一種 狀態(tài)管理策略,在web應(yīng)用程序中,它常常用來緩存一些數(shù)據(jù)到內(nèi)存中供后續(xù)請(qǐng)求復(fù)用,這樣就規(guī)避了原來不得不走硬盤取數(shù)據(jù)的尷尬,顯而易見,緩存是提高 web 程序性能的一大利器,
雖然 ASP.NET Core 缺少內(nèi)置的 Cache,但它提供了對(duì)三種緩存類型的支持:內(nèi)存緩存,分布式緩存 和 響應(yīng)緩存。
為什么要使用 LazyCache
LazyCache 是一個(gè)開源的,簡(jiǎn)單的,線程安全的,可擴(kuò)展的 緩存組件,在底層,LazyCache 使用了 Microsoft.Extensions.Caching 下的 MemoryCache 并使用了 懶鎖 來確保 委托 只會(huì)執(zhí)行一次。
如果你想緩存從數(shù)據(jù)庫(kù)中取得的數(shù)據(jù),復(fù)雜的對(duì)象圖 和 web服務(wù)調(diào)用,那么使用 LazyCache 是一個(gè)非常好的選擇,通常默認(rèn)緩存的時(shí)間是 20min。
下面簡(jiǎn)單羅列了 LazyCache 的一些特點(diǎn)。
- 可擴(kuò)展性
- 開源
- 友好的 API 接口
- 內(nèi)置 lazy 鎖
- 底層使用 MemoryCache
配置 LazyCache
要想配置 LazyCache,可以在 ConfigureServices() 方法中通過調(diào)用 AddLazyCache() 將 LazyCache 注入到 ServiceContainer 中,如下代碼所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddLazyCache();
services.AddControllers();
}
這樣就可以確保 LazyCache 可以貫穿在你的應(yīng)用程序中,要想訪問 LazyCache 可以通過 IAppCache 接口,定義如下:
public interface IAppCache
{
ICacheProvider CacheProvider { get; }
CacheDefaults DefaultCachePolicy { get; }
void Add<T>(string key, T item, MemoryCacheEntryOptions policy);
T Get<T>(string key);
Task<T> GetAsync<T>(string key);
T GetOrAdd<T>(string key, Func<ICacheEntry, T> addItemFactory);
T GetOrAdd<T>(string key, Func<ICacheEntry, T> addItemFactory, MemoryCacheEntryOptions policy);
Task<T> GetOrAddAsync<T>(string key, Func<ICacheEntry, Task<T>> addItemFactory);
Task<T> GetOrAddAsync<T>(string key, Func<ICacheEntry, Task<T>> addItemFactory, MemoryCacheEntryOptions policy);
void Remove(string key);
bool TryGetValue<T>(string key, out object value);
}
將 IAppCache 注入到 Controller 中
一切都配置好之后,接下來就可以將 IAppCache 通過構(gòu)造函數(shù)注入的方式灌到 Controller 中,如下代碼所示:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly IAppCache _lazyCache;
public WeatherForecastController(IAppCache cache)
{
this._lazyCache = cache;
}
}

通過 LazyCache 新增,獲取數(shù)據(jù)
考慮如下返回 list 的 GetData() 方法。
private async Task<List<string>> GetData()
{
return new List<string>()
{
"Joydip Kanjilal",
"Steve Smith",
"Rick Smith"
};
}
接下來通過 GetOrAddAsync 方法從緩存獲取或添加數(shù)據(jù),如下代碼所示:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly IAppCache _lazyCache;
public WeatherForecastController(IAppCache cache)
{
this._lazyCache = cache;
}
[HttpGet]
public async Task<IEnumerable<string>> Get()
{
var data = await _lazyCache.GetOrAddAsync("Authors", GetData, DateTimeOffset.Now.AddMinutes(30));
return data;
}
private async Task<List<string>> GetData()
{
return new List<string>()
{
"Joydip Kanjilal",
"Steve Smith",
"Rick Smith"
};
}
}

如果你想在內(nèi)存中存儲(chǔ)更多的數(shù)據(jù)或者你想使用檔次更高的緩存服務(wù),推薦使用 Redis 作為分布式緩存,而 LazyCache 🐂👃的地方在于你使用的一直是 IAppCache,這就意味著你可以輕松的用 Redis 來替換底層默認(rèn)的 MemoryCache。
譯文鏈接:https://www.infoworld.com/article/3608568/how-to-use-lazycache-in-aspnet-core-mvc-5.html
總結(jié)
到此這篇關(guān)于ASP.NET Core中使用LazyCache的文章就介紹到這了,更多相關(guān)ASP.NET Core使用LazyCache內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- ASP.NET Core擴(kuò)展庫(kù)之Http請(qǐng)求模擬功能的使用
- ASP.NET Core擴(kuò)展庫(kù)之Http通用擴(kuò)展庫(kù)的使用詳解
- ASP.NET Core實(shí)現(xiàn)自動(dòng)依賴注入
- ASP.NET Core中使用令牌桶限流的實(shí)現(xiàn)
- ASP.NET Core自動(dòng)生成小寫破折號(hào)路由的實(shí)現(xiàn)方法
- 如何在ASP.NET Core中使用HttpClientFactory
- 如何在ASP.Net Core中使用Serilog
- ASP.NET Core 5中如何生成PDF文檔
- ASP.NET Core擴(kuò)展庫(kù)之實(shí)體映射使用詳解
- ASP.NET Core快速入門之環(huán)境篇
相關(guān)文章
詳解可跨域的單點(diǎn)登錄(SSO)實(shí)現(xiàn)方案【附.net代碼】
本篇文章主要介紹了可跨域的單點(diǎn)登錄(SSO)實(shí)現(xiàn)方案,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11
適用與firefox ASP.NET無刷新二級(jí)聯(lián)動(dòng)下拉列表
適用與firefox ASP.NET無刷新二級(jí)聯(lián)動(dòng)下拉列表...2007-08-08
asp.net中C#獲取字符串中漢字的個(gè)數(shù)的具體實(shí)現(xiàn)方法
獲取字符串中漢字原理是判斷漢字編碼然后進(jìn)行判斷是漢字還是數(shù)字了,還有就是利用正則表達(dá)式,同樣是以漢字ascii為標(biāo)準(zhǔn)來獲取2014-02-02
詳解.NET6下的Modbus通訊和數(shù)據(jù)庫(kù)記錄
本文主要介紹了.NET6下的Modbus通訊和數(shù)據(jù)庫(kù)記錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
微信公眾平臺(tái)開發(fā)之自定義菜單.Net代碼解析
這篇文章主要為大家詳細(xì)解析了微信公眾平臺(tái)開發(fā)之自定義菜單.Net代碼,感興趣的小伙伴們可以參考一下2016-06-06
.NET或.NET Core Web APi基于tus協(xié)議實(shí)現(xiàn)斷點(diǎn)續(xù)傳的示例
這篇文章主要介紹了.NET或.NET Core Web APi基于tus協(xié)議實(shí)現(xiàn)斷點(diǎn)續(xù)傳的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
.Net Core WebApi的簡(jiǎn)單創(chuàng)建以及使用方法
這篇文章主要給大家介紹了關(guān)于.Net Core WebApi的簡(jiǎn)單創(chuàng)建以及使用方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.Net Core WebApi具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
詳解JQuery Ajax 在asp.net中使用總結(jié)
這篇文章主要介紹了詳解JQuery Ajax 在asp.net中使用總結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01

