擁抱.NET Core系列:MemoryCache 緩存過時

在上一篇」擁抱.NET Core系列:MemoryCache 初識」中咱們基本瞭解了緩存的添加、刪除、獲取,那麼今天咱們來看看緩存的過時機制。這裏和上篇同樣將把「Microsoft.Extensions.Caching.Memory」簡稱爲MSCache。html

MSCache項目

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

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

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

MSCache提供的過時方式

從源碼來講,MSCache提供瞭如下三種緩存過時的方式3d

  1. 絕對到期(指定在一個固定的時間點到期)
  2. 滑動到期(在一個時間長度內沒有被命中則過時)
  3. 到期Token(自定義過時)

下面咱們來一一看看這些方式。htm

絕對時間到期

image

絕對到期很是的簡單,MS提供了一個擴展方法 「SetAbsoluteExpiration」 用來設置絕對到期時間。blog

image

這邊的第一個方法定義中的 relative 是指從當前時間度過這麼久的時間以後過時,相似 DateTime.Now.Add(relative)。token

爲何說相似呢?接口

由於每一個國家地區的時間可能不一致,MSCache默認使用了UTC時間,這個時間能夠在options進行修改,後面在作介紹。get

滑動時間到期

image

除了前兩次迭代知足2秒內命中緩存,剩餘的3次迭代沒法知足2秒內命中,因此從第三次迭代開始緩存項都會過時。

自定義過時策略

不少時候咱們的緩存過時條件並非只有時間,好比咱們對一個文件內容進行了緩存,當文件變更的時候須要從新加載文件更新緩存。再好比咱們緩存了用戶信息,在一個bus上接收到了用戶信息變更後清除用戶緩存並從新緩存用戶。

MS爲咱們提供了一個很是簡單的自定義過時策略。

MS把這個過時策略使用一個接口 IChangeToken 來暴露。下面咱們來看看 IChangeToken。

IChangeToken

IChangeToken不徹底爲MS而生,而是一個基礎包裏面的接口,因此在理解這個接口的時候儘可能不要帶入緩存來考慮。

image

HasChanged 顧名思義,用來返回是否發生了變動,在MSCache中若是返回了true則緩存項將會失效。

ActiveChangeCallbacks 一個有點玄學的屬性,該屬性更可能是一種描述,字面意思是該token是否會激活回調,取決於IChangeToken實現者的邏輯,若是這個值返回false則不要指望經過IChangeToken的RegisterChangeCallback來達到發生變動的時候有回調通知。

RegisterChangeCallback 註冊一個回調,當變動發生時執行,通常配合ActiveChangeCallbacks來達成。

一個約束並非強制

ActiveChangeCallbacks 爲 true 時經過RegisterChangeCallback 註冊的回調會在發生變動時被回調執行,反之相反。

MS其它組件實現的IChangeToken

  1. CancellationChangeToken (一個對CancellationToken的包裝)
  2. CompositeChangeToken (組合ChangeToken,能夠將多個ChangeToken包裝成一個Token)
  3. ConfigurationReloadToken (配置從新加載Token,來自MS.Configuration組件)
  4. PollingFileChangeToken (經過輪訓來監控文件變動)
  5. PollingWildCardChangeToken (經過輪訓來監控文件變動,這個是支持通配符的)
  6. ……

緩存一個文件,並在文件變化時候更新緩存內容

image

手動過時緩存

image

ChangeToken的一次性

恩,妥妥的輸出 1 1 2 2?

image

實際輸出結果 1 1 2 3

爲何?

由於咱們以前講到ChangeToken是經過HasChanged來判斷緩存是否過時的。

在這邊咱們調用了cts的Cancel,那麼不管如何HasChanged後續都會是true,由於cts的Cancel是不可逆的。

正確的作法

image

這邊正確的作法只是強調,ChangeToken是一次性的,具體如何達到這個目的你們能夠自由發揮。

自定義一個ChangeToken,噹噹前時間的分數爲偶數時候過時

image

image

過時策略組合拳

上面介紹了MSCache中的過時策略,但都是單獨使用的,其實這些過時策略能夠混合使用。

好比指定 1個小時後到期或者10分鐘內沒有命中到期。

image

IChangeToken固然也是能夠的。

這邊的過時策略是隻要啓動一個條件達成那麼這個緩存就是無效的。

緩存過時回調

不少時候咱們但願緩存過時以後能作一些事情,好比從新寫入緩存等等,MSCache提供了這樣的機制。

使用回調相關的定義

image

image

image

示例

image

寫在最後

image

你們思考一下這段代碼爲何會沒有回調輸出?

本篇主要講了MSCache中緩存過時的幾種使用方式和擴展方式。下一篇會介紹下MSCache中的一些運行機制,好比上面的代碼爲什麼沒有輸出?如何清除一組緩存等等。

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

相關文章
相關標籤/搜索