您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關怎么在.NET Core中使用MemoryCache 實現緩存選項,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
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
Clock 顧名思義,是用來提供時間的一個成員,緩存里面大量用到了時間來判斷緩存是否過期。
CompactOnMemoryPressure 已經被廢棄,可以不用管
ExpirationScanFrequency 過期掃描頻率(默認為1分鐘,可以理解為每過多久移除一次過期的緩存項)
SizeLimit 緩存大小限制(這屬于一個說明性屬性,而且單位也不是緩存數目,而是緩存真正占用的空間大小)
CompactionPercentage 壓縮率(默認0.05,百分比)
Clock
初次見到的時候以為是用來自定義 LocalTime,其實不是(當然要這么做也可以),在 MSCache 中只允許用 Utc 時間,但是為什么既然都是 Utc 時間還要留這個擴展選項呢?
很簡單,默認的當前時間是當前系統的當前時間,在一些對時間精度要求比較高的情況下就可以重寫 Clock 來實現自己自定義的獲取當前時間的邏輯。
緩存無非是一個字典表,當一些緩存項過期失效時候我們需要移除字典表里面的內容。
然而準確的做到每個緩沖項過期就進行移除是非常損失性能的(類似GC),所以 MSCache 提供了一個屬性來設置,沒間隔多久才進行一次過期緩存移除。
這個值默認為1分鐘。
什么時候會進行過期緩存清理?
添加新的
獲取緩存項
刪除緩存項目
當有緩存項過期(通過過期回調)
這邊就解釋了上一節的最后為什么沒有回調輸出。
因為MSCache里面沒有使用定時器來進行過期掃描。
ps:緩存過期清理是一個異步方法也就是不會堵塞當前線程。
這個屬性在 MemoryCache 中幾乎沒有用,在 MemoryCache 中關于緩存項的大小默認都是null或0。
因為這個屬性并不是緩存項的數量,而是緩存真正占用的空間大小,如這個緩存項占用了多少內存。
然而在.NET中計算一個對象所占用的內存是很難且損耗性能的,所以在 MemoryCache 中這個屬性幾乎可以看做沒有。
當然你可以通過手動設置緩存項的Size來啟用相關功能。這邊我們只簡單說明,詳細講解會在后面的分布式緩存中進行說明。
這個屬性的作用是:當所有緩存大小超過這個值的時候進行一次緩存壓縮。
當內存大小超過 SizeLimit 時候進行壓縮的比率,默認值是0.05,也就是百分之5。
具體的計算方式是
得到剩余的緩存大小 SizeLimit * 1 – CompactionPercentage
得到需要壓縮的大小 CurrentSize – (SizeLimit * 1 – CompactionPercentage)
緩存的清理優先級
這時候就牽扯到 CacheEntry 中的 Priority 屬性了,當發生這種情況的時候 MSCache 會按以下優先級進行壓縮處理
Low
Normal
High
為什么沒有 NeverRemove ?因為 NeverRemove 永遠不會在超過 SizeLimt 時候進行清理。
那么當緩存大小超過SizeLimit時,MSCache會
先清理Low優先級的緩存項(不管是否過期)
再清理Normal優先級的緩存項(不管是否過期)
繼續清理High優先級的緩存項(不管是否過期)
CacheEntry 默認的 優先級為:Normal。
關于怎么在.NET Core中使用MemoryCache 實現緩存選項就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。