溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何在.Net Core 使用緩存和配置

發(fā)布時(shí)間:2021-11-10 10:46:18 來(lái)源:億速云 閱讀:374 作者:柒染 欄目:大數(shù)據(jù)

本篇文章為大家展示了如何在.Net Core 使用緩存和配置,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

前言

????幾乎在所有的應(yīng)用程序中,緩存都是一個(gè)永恒的話(huà)題,恰當(dāng)?shù)氖褂镁彺婵梢杂行岣邞?yīng)用程序的性能;在某些業(yè)務(wù)場(chǎng)景下,使用緩存依賴(lài)會(huì)有很好的體驗(yàn);在 Asp.Net Core 中,支持了多種緩存組件,這其中最基礎(chǔ)也最易用的當(dāng)屬 IMemoryCache,該接口表示其存儲(chǔ)依賴(lài)于托管程序服務(wù)器的內(nèi)存,下面要介紹的內(nèi)容就是基于 IMemoryCache 的緩存依賴(lài)。

1. IMemoryCache 的實(shí)現(xiàn)

Asp.Net Core 內(nèi)部實(shí)現(xiàn)了一個(gè)繼承自 IMemoryCache 接口的類(lèi) MemoryCache
這幾乎已成慣例,一旦某個(gè)接口被列入 SDK 中,其必然包含了一個(gè)默認(rèn)實(shí)現(xiàn)

1.1 使用 IMemoryCache

在 Asp.Net Core 中要使用 IMemoryCache 非常簡(jiǎn)單,只需要在 Startup 的 ConfigureServices 方法加入一句代碼 services.AddMemoryCache() 即可

如何在.Net Core 使用緩存和配置

1.2 在控制器中使用 IMemoryCache

如何在.Net Core 使用緩存和配置

上面的代碼表示在 HomeController 控制器的構(gòu)造方法中使用注入的方式獲得了一個(gè) IMemoryCache 對(duì)象,在 Get() 方法中增加了一條緩存記錄 "userId=0001",然后在 Get(int id) 接口中提取該緩存記錄
運(yùn)行程序,分別調(diào)用 Get() 和 Get(int id) 接口,獲得下面的輸出信息

  • 調(diào)用 Get() 接口

如何在.Net Core 使用緩存和配置

  • 調(diào)用 Get(int id) 接口

如何在.Net Core 使用緩存和配置

這看起來(lái)非常容易,幾乎不用什么思考,你就學(xué)會(huì)了在 Asp.Net Core 中使用緩存,容易使用,這非常重要,這也是一門(mén)語(yǔ)言廣泛推廣的根本態(tài)度

2. 應(yīng)用緩存策略

IMemoryCache 還包含了一個(gè)帶參數(shù)的構(gòu)造方法,讓我們可以對(duì)緩存進(jìn)行靈活的配置,該配置由類(lèi) MemoryCacheOptions 決定

2.1 MemoryCacheOptions 配置,MemoryCacheOptions的配置項(xiàng)目不多,看下面的代碼

如何在.Net Core 使用緩存和配置

  • ISystemClock:系統(tǒng)時(shí)鐘,默認(rèn)值為 null,官方文檔對(duì)此屬性沒(méi)有說(shuō)明,我也不知道是干什么用的,哪位大神求告知其作用和原理

  • ExpirationScanFrequency:對(duì)過(guò)期緩存的掃描間隔時(shí)間

  • SizeLimit:緩存區(qū)可存儲(chǔ)記錄條目數(shù)量

  • CompactionPercentage:在緩存過(guò)期策略生效的時(shí)候,對(duì)緩存進(jìn)行壓縮的百分比

上面的這個(gè)配置非常簡(jiǎn)單,在系統(tǒng)中應(yīng)用類(lèi)似下面的代碼這樣

如何在.Net Core 使用緩存和配置

上面的緩存策略設(shè)置為緩存壓縮比為 2%,每 5 分鐘進(jìn)行一次過(guò)期緩存的掃描,最大緩存空間大小限制為 1024
使用方法不變

2.1 單個(gè)鍵緩存策略

由于緩存的所有鍵其緩存過(guò)期優(yōu)先級(jí)都是默認(rèn)的 Normal,可能我們需要在某些業(yè)務(wù)場(chǎng)景下,讓某些緩存值設(shè)置一個(gè)較高的優(yōu)先級(jí),比如設(shè)置永遠(yuǎn)都不過(guò)期,這樣即使緩存達(dá)到最大限制條數(shù)以后也不會(huì)對(duì)其進(jìn)行清理

  • 緩存優(yōu)先級(jí),該值為一個(gè)枚舉類(lèi)型,分別是 低、普通、高、永不移除,開(kāi)發(fā)者可以根據(jù)不同的業(yè)務(wù)場(chǎng)景靈活設(shè)置

如何在.Net Core 使用緩存和配置

  • 設(shè)置策略,下面就使用 MemoryCacheEntryOptions 對(duì)單個(gè)鍵值進(jìn)行應(yīng)用策略

如何在.Net Core 使用緩存和配置

上面的代碼表示,我們對(duì)緩存鍵 "userId" 應(yīng)用了一個(gè) “永不移除” 的策略,當(dāng)然,還可以對(duì)單個(gè)值做非常多的策略,比如現(xiàn)在 "userId" 的值大小等等,有興趣的同學(xué)可以深入了解 MemoryCacheEntryOptions 類(lèi)

3. 使用緩存依賴(lài)策略

緩存依賴(lài)的意思是表示,一個(gè)或者多個(gè)緩存依賴(lài)于某個(gè)緩存,當(dāng)某個(gè)緩存過(guò)期的時(shí)候,對(duì)其有依賴(lài)條件的其它緩存也會(huì)過(guò)期,在某些應(yīng)用場(chǎng)景下,緩存依賴(lài)非常有用

3.1 創(chuàng)建 TokenController 并登錄后注冊(cè)依賴(lài)、獲取緩存、移除緩存接口

以下示例使用一個(gè)模擬用戶(hù)登錄/登出的業(yè)務(wù)場(chǎng)景

如何在.Net Core 使用緩存和配置

如何在.Net Core 使用緩存和配置

如何在.Net Core 使用緩存和配置

上面的代碼使用 CancellationTokenSource 用作事件通知源,當(dāng)移除 CacheKeys.DependentCTS 并觸發(fā) CancellationTokenSource.Cancel() 方法后,將異步觸發(fā) DependentEvictionCallback(object key, object value, EvictionReason reason, object state)委托;此時(shí),托管程序收到一個(gè)通知,用戶(hù)已登出,已移除用戶(hù)相關(guān)緩存,任何移除接口嘗試再次讀取 CacheKeys 項(xiàng),此時(shí),返回值為空

3.2 運(yùn)行程序,分別調(diào)用 login/getkeys/logout 接口,分別得到以下輸出結(jié)果
  • login 登錄后注冊(cè)依賴(lài)

如何在.Net Core 使用緩存和配置

  • getkeys 獲取緩存

如何在.Net Core 使用緩存和配置

  • logout 移除緩存,嘗試再次讀取 CacheKeys 項(xiàng),此時(shí),返回值為空

如何在.Net Core 使用緩存和配置

  • 控制臺(tái)輸出移除通知(黃色字體部分信息)

如何在.Net Core 使用緩存和配置

可以看到,在用戶(hù)登錄登出這個(gè)業(yè)務(wù)場(chǎng)景下,使用緩存依賴(lài)項(xiàng)對(duì)其相關(guān)緩存進(jìn)行管理,還是非常方便的,當(dāng)用戶(hù)退出登錄后,即清空其所有相關(guān)緩存

  • 本文通過(guò)實(shí)例介紹了 IMemoryCache 的簡(jiǎn)單使用方法

  • 針對(duì)單個(gè)緩存鍵,也可以對(duì)其進(jìn)行應(yīng)用策略

  • 通過(guò)使用緩存依賴(lài)策略,可以在某些業(yè)務(wù)場(chǎng)景中有非常好的應(yīng)用體驗(yàn)

  • 注意:當(dāng)使用全局緩存策略 SizeLimit 時(shí),每個(gè)鍵都需要設(shè)置一個(gè)大小

  • IMemoryCache 依賴(lài)于托管服務(wù)器等內(nèi)存,一旦重啟,緩存數(shù)據(jù)將立即被釋放

上述內(nèi)容就是如何在.Net Core 使用緩存和配置,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI