擁抱.NET Core系列:MemoryCache 緩存選項


在上一篇 ”擁抱.NET Core系列:MemoryCache 緩存過期” 中我們詳細的了解了緩存過期相關的內容,今天我們來介紹一下 MSCache 中的 Options,由此來介紹一些 MSCache 中的內部機制。

MSCache項目

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

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

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

MemoryCacheOptions

image

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

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

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

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

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

Clock

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

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

ExpirationScanFrequency

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

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

這個值默認為1分鍾。

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

  1. 添加新的
  2. 獲取緩存項
  3. 刪除緩存項目
  4. 當有緩存項過期(通過過期回調)

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

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

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

SizeLimit

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

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

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

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

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

CompactionPercentage

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

具體的計算方式是

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

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

緩存的清理優先級

image

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

  1. Low
  2. Normal
  3. High

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

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

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

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

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

CacheEntry 默認的 優先級為:Normal。

寫在最后

今天介紹了一些 MSCache 的內部機制,后續會講一下 緩存域 和 一些小技巧。

.NET技術棧QQ群:384413261(點擊加入 .NET Group


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM