.NET Core系列之MemoryCache 緩存過期
在上一篇”擁抱.NET Core系列:MemoryCache 初識”中我們基本了解了緩存的添加、刪除、獲取,那么今天我們來看看緩存的過期機(jī)制。這里和上篇一樣將把“Microsoft.Extensions.Caching.Memory”簡稱為MSCache。
MSCache項(xiàng)目
MSCache目前最新的正式版是 2.0.0,預(yù)覽版是2.1.0,會與.NETCore 2.1一起發(fā)布。本篇用了2.0.0版本
開源在GitHub上,倉庫地址是:https://github.com/aspnet/Caching
NuGet地址為:https://www.nuget.org/packages/Microsoft.Extensions.Caching.Memory/2.0.0
MSCache提供的過期方式
從源碼來說,MSCache提供了以下三種緩存過期的方式
絕對到期(指定在一個(gè)固定的時(shí)間點(diǎn)到期)滑動到期(在一個(gè)時(shí)間長度內(nèi)沒有被命中則過期)到期Token(自定義過期)
下面我們來一一看看這些方式。
絕對時(shí)間到期

絕對到期非常的簡單,MS提供了一個(gè)擴(kuò)展方法 “SetAbsoluteExpiration” 用來設(shè)置絕對到期時(shí)間。

這邊的第一個(gè)方法定義中的 relative 是指從當(dāng)前時(shí)間度過這么久的時(shí)間之后過期,類似 DateTime.Now.Add(relative)。
為什么說類似呢?
因?yàn)槊總€(gè)國家地區(qū)的時(shí)間可能不一致,MSCache默認(rèn)使用了UTC時(shí)間,這個(gè)時(shí)間可以在options進(jìn)行修改,后面在做介紹。
滑動時(shí)間到期

除了前兩次迭代滿足2秒內(nèi)命中緩存,剩余的3次迭代無法滿足2秒內(nèi)命中,所以從第三次迭代開始緩存項(xiàng)都會過期。
自定義過期策略
很多時(shí)候我們的緩存過期條件并不是只有時(shí)間,比如我們對一個(gè)文件內(nèi)容進(jìn)行了緩存,當(dāng)文件變動的時(shí)候需要重新加載文件更新緩存。再比如我們緩存了用戶信息,在一個(gè)bus上接收到了用戶信息變動后清除用戶緩存并重新緩存用戶。
MS為我們提供了一個(gè)非常簡單的自定義過期策略。
MS把這個(gè)過期策略使用一個(gè)接口 IChangeToken 來暴露。下面我們來看看 IChangeToken。
IChangeToken
IChangeToken不完全為MS而生,而是一個(gè)基礎(chǔ)包里面的接口,所以在理解這個(gè)接口的時(shí)候盡量不要帶入緩存來考慮。

HasChanged 顧名思義,用來返回是否發(fā)生了變更,在MSCache中如果返回了true則緩存項(xiàng)將會失效。
ActiveChangeCallbacks 一個(gè)有點(diǎn)玄學(xué)的屬性,該屬性更多是一種描述,字面意思是該token是否會激活回調(diào),取決于IChangeToken實(shí)現(xiàn)者的邏輯,如果這個(gè)值返回false則不要期望通過IChangeToken的RegisterChangeCallback來達(dá)到發(fā)生變更的時(shí)候有回調(diào)通知。
RegisterChangeCallback 注冊一個(gè)回調(diào),當(dāng)變更發(fā)生時(shí)執(zhí)行,一般配合ActiveChangeCallbacks來達(dá)成。
一個(gè)約束并不是強(qiáng)制
ActiveChangeCallbacks 為 true 時(shí)通過RegisterChangeCallback 注冊的回調(diào)會在發(fā)生變更時(shí)被回調(diào)執(zhí)行,反之相反。
MS其它組件實(shí)現(xiàn)的IChangeToken
CancellationChangeToken (一個(gè)對CancellationToken的包裝)
CompositeChangeToken (組合ChangeToken,可以將多個(gè)ChangeToken包裝成一個(gè)Token)
ConfigurationReloadToken (配置重新加載Token,來自MS.Configuration組件)
PollingFileChangeToken (通過輪訓(xùn)來監(jiān)控文件變更)
PollingWildCardChangeToken (通過輪訓(xùn)來監(jiān)控文件變更,這個(gè)是支持通配符的)
……
緩存一個(gè)文件,并在文件變化時(shí)候更新緩存內(nèi)容

手動過期緩存

ChangeToken的一次性
恩,妥妥的輸出 1 1 2 2?

實(shí)際輸出結(jié)果 1 1 2 3
為什么?
因?yàn)槲覀冎爸v到ChangeToken是通過HasChanged來判斷緩存是否過期的。
在這邊我們調(diào)用了cts的Cancel,那么無論如何HasChanged后續(xù)都會是true,因?yàn)閏ts的Cancel是不可逆的。
正確的做法

這邊正確的做法只是強(qiáng)調(diào),ChangeToken是一次性的,具體如何達(dá)到這個(gè)目的大家可以自由發(fā)揮。
自定義一個(gè)ChangeToken,當(dāng)當(dāng)前時(shí)間的分?jǐn)?shù)為偶數(shù)時(shí)候過期


過期策略組合拳
上面介紹了MSCache中的過期策略,但都是單獨(dú)使用的,其實(shí)這些過期策略可以混合使用。
比如指定 1個(gè)小時(shí)后到期或者10分鐘內(nèi)沒有命中到期。

IChangeToken當(dāng)然也是可以的。
這邊的過期策略是只要啟動一個(gè)條件達(dá)成那么這個(gè)緩存就是無效的。
緩存過期回調(diào)
很多時(shí)候我們希望緩存過期之后能做一些事情,比如重新寫入緩存等等,MSCache提供了這樣的機(jī)制。
使用回調(diào)相關(guān)的定義



示例

寫在最后

大家思考一下這段代碼為什么會沒有回調(diào)輸出?
本篇主要講了MSCache中緩存過期的幾種使用方式和擴(kuò)展方式。下一篇會介紹下MSCache中的一些運(yùn)行機(jī)制,比如上面的代碼為何沒有輸出?如何清除一組緩存等等。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
.NET的file文件上傳控件使用方法 修改web.config文件上傳大文件
這篇文章主要介紹了.NET修改web.config文件上傳大文件的方法,大家參考使用吧2014-01-01
Asp.net GridView隔行變色和光棒效果2種方法實(shí)現(xiàn)
兩種方法實(shí)現(xiàn)GridView隔行變色和光棒效果:前臺和后臺配合使用及JQuery方式,感興趣的朋友可以參考下哈,希望可以幫助到你2013-04-04
VS2010發(fā)布Web網(wǎng)站技術(shù)攻略
本篇文章主要包含了完整的發(fā)布網(wǎng)站步驟、發(fā)布網(wǎng)站過程中可能遇到的問題,以及配套的解決方法,相信感興趣的朋友一定會喜歡這篇文章的2015-07-07
Asp.net下用JQuery找出哪一個(gè)元素引起PostBack
在Asp.net webform中,如何找出哪一個(gè)按鈕觸發(fā)Button PostBack事件。2010-06-06
.NET Core如何進(jìn)行請求轉(zhuǎn)發(fā)的實(shí)現(xiàn)
這篇文章主要介紹了.NET Core如何進(jìn)行請求轉(zhuǎn)發(fā)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
asp.net C#實(shí)現(xiàn)解壓縮文件的方法
這篇文章主要介紹了asp.net C#實(shí)現(xiàn)解壓縮文件的方法,分別講述了三種不同的實(shí)現(xiàn)方法,是非常實(shí)用的技巧,需要的朋友可以參考下2014-11-11
小心!ASP.NET網(wǎng)站發(fā)布時(shí)的那些坑
ASP.NET網(wǎng)站發(fā)布時(shí)的那些坑,要小心了,為什么網(wǎng)站發(fā)布后,每個(gè)頁面第一次打開都很卡?ASP.NET session 頻繁丟失如何解決?具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
ASP.NET驗(yàn)證碼實(shí)現(xiàn)(附源碼)
這篇文章主要介紹了ASP.NET驗(yàn)證碼實(shí)現(xiàn)過程,并為大家分享了源碼下載,感興趣的小伙伴們可以參考一下2015-11-11

