1. 程式人生 > >擁抱.NET Core系列:MemoryCache 初識 (轉載)

擁抱.NET Core系列:MemoryCache 初識 (轉載)

閱讀目錄

 

Cache是一個絕大多數專案會用到的一個技術,說起到快取可能就聯想到 Set、Add、Get、Remove、Clear 這幾個方法。那麼在.NET Core中微軟給我們帶來了什麼樣的快取體驗呢?今天我們就來介紹下”Microsoft.Extensions.Caching.Memory”。由於這個包名稱過長,下文使用MSCache來代替

回到目錄

 

MSCache能做什麼?


 

  1. 絕對過期支援
  2. 滑動過期支援(指定一個時間,TimeSpan,指定時間內有被Get快取時間則順延,否則過期)
  3. 過期回撥
  4. 自定義過期

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

回到目錄

 

 

從IMemoryCache說起


 

IMemoryCache 就提供了三個方法並實現了 IDisposable 介面。
很好理解
CreateEntry

新增一個快取
Remove 刪除一個快取
TryGetValue 獲取一個快取(並可得到具體的快取是否存在)

 

ICacheEntry


 

ICacheEntry 有以上成員,同時實現了 IDisposable 介面,為什麼要實現這個介面?用來釋放快取嗎?這個在接下來的篇幅會做解釋。
Key 快取key
Value 快取值
AbsoluteExpiration 絕對過期時間,為null則條件無效
AbsoluteExpirationRelativeToNow 相對當前時間的絕對過期時間(使用TimeSpan),為null條件無效
SlidingExpiration 滑動過期時間
ExpirationTokens

提供用來自定義快取過期
PostEvictionCallbacks 快取失效回撥
Priority 快取項優先順序(在快取滿載的時候絕對清除的順序)
Size 代表快取資料的大小,在記憶體快取中一般為null

 

我們來試試


 

恩,妥妥的,輸出 “True” 和 “1”。

納尼,居然是“False”和null。

 

玄學


 

有些同學可能已經注意到了 ICacheEntry 實現了IDisposable介面。為什麼ICacheEntry要實現 IDisposable 介面呢?講真我也不知道。反正大家知道它是具體像MemoryCache插入快取的方法就行。
這有點違背了我們之前所學的 IDisposable 用來釋放資源的原則。

 

正確的開啟方式


 

回到目錄

 

 

開發者的體驗


 

說到底還不是 Set、Add、Get、Remove、Clear ?跟之前差不多啊。
MS團隊提供了一個 CacheExtensions 擴充套件方法類

Get 比較好理解這邊不多做累述。
Set 設定一個新的快取條目(相同key的會被移除)就好像被set的這個key是一個完全新的東西,所以也不會繼承之前的過期時間和過期token。

 

GetOrCreate


 

基本都用它,我們來看看。

兩種方式 GetOrCreate 減少了第一種模式的判斷。回撥裡面的entry就是ICacheEntry可以用來設定快取的其它選項。
同時在這個Task滿天飛的日子裡,還提供了了 GetOrCreateAsync 擴充套件方法。

回到目錄

 

 

寫在最後


 

MSCache跟Orchard中的Caching非常的相識,或者說借鑑了Orchard中良好的Caching重構而來。
下一篇會主要介紹MSCache中的快取過期機制。

 

原文連結