在上一篇」擁抱.NET Core系列:MemoryCache 初識」中咱們基本瞭解了緩存的添加、刪除、獲取,那麼今天咱們來看看緩存的過時機制。這裏和上篇同樣將把「Microsoft.Extensions.Caching.Memory」簡稱爲MSCache。html
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提供瞭如下三種緩存過時的方式3d
下面咱們來一一看看這些方式。htm
絕對到期很是的簡單,MS提供了一個擴展方法 「SetAbsoluteExpiration」 用來設置絕對到期時間。blog
這邊的第一個方法定義中的 relative 是指從當前時間度過這麼久的時間以後過時,相似 DateTime.Now.Add(relative)。token
爲何說相似呢?接口
由於每一個國家地區的時間可能不一致,MSCache默認使用了UTC時間,這個時間能夠在options進行修改,後面在作介紹。get
除了前兩次迭代知足2秒內命中緩存,剩餘的3次迭代沒法知足2秒內命中,因此從第三次迭代開始緩存項都會過時。
不少時候咱們的緩存過時條件並非只有時間,好比咱們對一個文件內容進行了緩存,當文件變更的時候須要從新加載文件更新緩存。再好比咱們緩存了用戶信息,在一個bus上接收到了用戶信息變更後清除用戶緩存並從新緩存用戶。
MS爲咱們提供了一個很是簡單的自定義過時策略。
MS把這個過時策略使用一個接口 IChangeToken 來暴露。下面咱們來看看 IChangeToken。
IChangeToken不徹底爲MS而生,而是一個基礎包裏面的接口,因此在理解這個接口的時候儘可能不要帶入緩存來考慮。
HasChanged 顧名思義,用來返回是否發生了變動,在MSCache中若是返回了true則緩存項將會失效。
ActiveChangeCallbacks 一個有點玄學的屬性,該屬性更可能是一種描述,字面意思是該token是否會激活回調,取決於IChangeToken實現者的邏輯,若是這個值返回false則不要指望經過IChangeToken的RegisterChangeCallback來達到發生變動的時候有回調通知。
RegisterChangeCallback 註冊一個回調,當變動發生時執行,通常配合ActiveChangeCallbacks來達成。
ActiveChangeCallbacks 爲 true 時經過RegisterChangeCallback 註冊的回調會在發生變動時被回調執行,反之相反。
恩,妥妥的輸出 1 1 2 2?
實際輸出結果 1 1 2 3
爲何?
由於咱們以前講到ChangeToken是經過HasChanged來判斷緩存是否過時的。
在這邊咱們調用了cts的Cancel,那麼不管如何HasChanged後續都會是true,由於cts的Cancel是不可逆的。
這邊正確的作法只是強調,ChangeToken是一次性的,具體如何達到這個目的你們能夠自由發揮。
上面介紹了MSCache中的過時策略,但都是單獨使用的,其實這些過時策略能夠混合使用。
好比指定 1個小時後到期或者10分鐘內沒有命中到期。
IChangeToken固然也是能夠的。
這邊的過時策略是隻要啓動一個條件達成那麼這個緩存就是無效的。
不少時候咱們但願緩存過時以後能作一些事情,好比從新寫入緩存等等,MSCache提供了這樣的機制。
你們思考一下這段代碼爲何會沒有回調輸出?
本篇主要講了MSCache中緩存過時的幾種使用方式和擴展方式。下一篇會介紹下MSCache中的一些運行機制,好比上面的代碼爲什麼沒有輸出?如何清除一組緩存等等。
.NET技術棧QQ羣:384413261(點擊加入 .NET Group)