溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在.NET Core中使用MemoryCache 實現緩存選項

發(fā)布時間:2021-06-08 16:16:05 來源:億速云 閱讀:196 作者:Leah 欄目:開發(fā)技術

這篇文章將為大家詳細講解有關怎么在.NET Core中使用MemoryCache 實現緩存選項,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

MSCache項目

MSCache 目前最新的正式版是 2.0.0,預覽版是2.1.0,會與 .NETCore 2.1 一起發(fā)布。本篇用了2.0.0版本

開源在 GitHub 上,倉庫地址是:https://github.com/aspnet/Caching

NuGet地址為:https://www.nuget.org/packages/Microsoft.Extensions.Caching.Memory/2.0.0

MemoryCacheOptions

怎么在.NET Core中使用MemoryCache 實現緩存選項

Clock 顧名思義,是用來提供時間的一個成員,緩存里面大量用到了時間來判斷緩存是否過期。

CompactOnMemoryPressure 已經被廢棄,可以不用管

ExpirationScanFrequency 過期掃描頻率(默認為1分鐘,可以理解為每過多久移除一次過期的緩存項)

SizeLimit 緩存大小限制(這屬于一個說明性屬性,而且單位也不是緩存數目,而是緩存真正占用的空間大?。?/p>

CompactionPercentage 壓縮率(默認0.05,百分比)

Clock

初次見到的時候以為是用來自定義 LocalTime,其實不是(當然要這么做也可以),在 MSCache 中只允許用 Utc 時間,但是為什么既然都是 Utc 時間還要留這個擴展選項呢?

很簡單,默認的當前時間是當前系統(tǒng)的當前時間,在一些對時間精度要求比較高的情況下就可以重寫 Clock 來實現自己自定義的獲取當前時間的邏輯。

ExpirationScanFrequency

緩存無非是一個字典表,當一些緩存項過期失效時候我們需要移除字典表里面的內容。

然而準確的做到每個緩沖項過期就進行移除是非常損失性能的(類似GC),所以 MSCache 提供了一個屬性來設置,沒間隔多久才進行一次過期緩存移除。

這個值默認為1分鐘。

什么時候會進行過期緩存清理?

  • 添加新的

  • 獲取緩存項

  • 刪除緩存項目

  • 當有緩存項過期(通過過期回調)

這邊就解釋了上一節(jié)的最后為什么沒有回調輸出。

因為MSCache里面沒有使用定時器來進行過期掃描。

ps:緩存過期清理是一個異步方法也就是不會堵塞當前線程。

SizeLimit

這個屬性在 MemoryCache 中幾乎沒有用,在 MemoryCache 中關于緩存項的大小默認都是null或0。

因為這個屬性并不是緩存項的數量,而是緩存真正占用的空間大小,如這個緩存項占用了多少內存。

然而在.NET中計算一個對象所占用的內存是很難且損耗性能的,所以在 MemoryCache 中這個屬性幾乎可以看做沒有。

當然你可以通過手動設置緩存項的Size來啟用相關功能。這邊我們只簡單說明,詳細講解會在后面的分布式緩存中進行說明。

這個屬性的作用是:當所有緩存大小超過這個值的時候進行一次緩存壓縮。

CompactionPercentage

當內存大小超過 SizeLimit 時候進行壓縮的比率,默認值是0.05,也就是百分之5。

具體的計算方式是

得到剩余的緩存大小 SizeLimit * 1 – CompactionPercentage

得到需要壓縮的大小 CurrentSize – (SizeLimit * 1 – CompactionPercentage)

緩存的清理優(yōu)先級

怎么在.NET Core中使用MemoryCache 實現緩存選項

這時候就牽扯到 CacheEntry 中的 Priority 屬性了,當發(fā)生這種情況的時候 MSCache 會按以下優(yōu)先級進行壓縮處理

  • Low

  • Normal

  • High

為什么沒有 NeverRemove ?因為 NeverRemove 永遠不會在超過 SizeLimt 時候進行清理。

那么當緩存大小超過SizeLimit時,MSCache會

先清理Low優(yōu)先級的緩存項(不管是否過期)

再清理Normal優(yōu)先級的緩存項(不管是否過期)

繼續(xù)清理High優(yōu)先級的緩存項(不管是否過期)

CacheEntry 默認的 優(yōu)先級為:Normal。

關于怎么在.NET Core中使用MemoryCache 實現緩存選項就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI