這篇文章將為大家詳細(xì)講解有關(guān).NET Core中MemoryCache怎么實(shí)現(xiàn)緩存過(guò)期,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
為舞鋼等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及舞鋼網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、舞鋼網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!MSCache項(xiàng)目
MSCache目前新的正式版是 2.0.0,預(yù)覽版是2.1.0,會(huì)與.NETCore 2.1一起發(fā)布。本篇用了2.0.0版本
開(kāi)源在GitHub上,倉(cāng)庫(kù)地址是:https://github.com/aspnet/Caching
NuGet地址為:https://www.nuget.org/packages/Microsoft.Extensions.Caching.Memory/2.0.0
從源碼來(lái)說(shuō),MSCache提供了以下三種緩存過(guò)期的方式
絕對(duì)到期(指定在一個(gè)固定的時(shí)間點(diǎn)到期)滑動(dòng)到期(在一個(gè)時(shí)間長(zhǎng)度內(nèi)沒(méi)有被命中則過(guò)期)到期Token(自定義過(guò)期)
下面我們來(lái)一一看看這些方式。
絕對(duì)到期非常的簡(jiǎn)單,MS提供了一個(gè)擴(kuò)展方法 “SetAbsoluteExpiration” 用來(lái)設(shè)置絕對(duì)到期時(shí)間。
這邊的第一個(gè)方法定義中的 relative 是指從當(dāng)前時(shí)間度過(guò)這么久的時(shí)間之后過(guò)期,類似 DateTime.Now.Add(relative)。
為什么說(shuō)類似呢?
因?yàn)槊總€(gè)國(guó)家地區(qū)的時(shí)間可能不一致,MSCache默認(rèn)使用了UTC時(shí)間,這個(gè)時(shí)間可以在options進(jìn)行修改,后面在做介紹。
除了前兩次迭代滿足2秒內(nèi)命中緩存,剩余的3次迭代無(wú)法滿足2秒內(nèi)命中,所以從第三次迭代開(kāi)始緩存項(xiàng)都會(huì)過(guò)期。
很多時(shí)候我們的緩存過(guò)期條件并不是只有時(shí)間,比如我們對(duì)一個(gè)文件內(nèi)容進(jìn)行了緩存,當(dāng)文件變動(dòng)的時(shí)候需要重新加載文件更新緩存。再比如我們緩存了用戶信息,在一個(gè)bus上接收到了用戶信息變動(dòng)后清除用戶緩存并重新緩存用戶。
MS為我們提供了一個(gè)非常簡(jiǎn)單的自定義過(guò)期策略。
MS把這個(gè)過(guò)期策略使用一個(gè)接口 IChangeToken 來(lái)暴露。下面我們來(lái)看看 IChangeToken。
IChangeToken
IChangeToken不完全為MS而生,而是一個(gè)基礎(chǔ)包里面的接口,所以在理解這個(gè)接口的時(shí)候盡量不要帶入緩存來(lái)考慮。
HasChanged 顧名思義,用來(lái)返回是否發(fā)生了變更,在MSCache中如果返回了true則緩存項(xiàng)將會(huì)失效。
ActiveChangeCallbacks 一個(gè)有點(diǎn)玄學(xué)的屬性,該屬性更多是一種描述,字面意思是該token是否會(huì)激活回調(diào),取決于IChangeToken實(shí)現(xiàn)者的邏輯,如果這個(gè)值返回false則不要期望通過(guò)IChangeToken的RegisterChangeCallback來(lái)達(dá)到發(fā)生變更的時(shí)候有回調(diào)通知。
RegisterChangeCallback 注冊(cè)一個(gè)回調(diào),當(dāng)變更發(fā)生時(shí)執(zhí)行,一般配合ActiveChangeCallbacks來(lái)達(dá)成。
一個(gè)約束并不是強(qiáng)制
ActiveChangeCallbacks 為 true 時(shí)通過(guò)RegisterChangeCallback 注冊(cè)的回調(diào)會(huì)在發(fā)生變更時(shí)被回調(diào)執(zhí)行,反之相反。
MS其它組件實(shí)現(xiàn)的IChangeToken
CancellationChangeToken (一個(gè)對(duì)CancellationToken的包裝)
CompositeChangeToken (組合ChangeToken,可以將多個(gè)ChangeToken包裝成一個(gè)Token)
ConfigurationReloadToken (配置重新加載Token,來(lái)自MS.Configuration組件)
PollingFileChangeToken (通過(guò)輪訓(xùn)來(lái)監(jiān)控文件變更)
PollingWildCardChangeToken (通過(guò)輪訓(xùn)來(lái)監(jiān)控文件變更,這個(gè)是支持通配符的)
……
緩存一個(gè)文件,并在文件變化時(shí)候更新緩存內(nèi)容
手動(dòng)過(guò)期緩存
ChangeToken的一次性
恩,妥妥的輸出 1 1 2 2?
實(shí)際輸出結(jié)果 1 1 2 3
為什么?
因?yàn)槲覀冎爸v到ChangeToken是通過(guò)HasChanged來(lái)判斷緩存是否過(guò)期的。
在這邊我們調(diào)用了cts的Cancel,那么無(wú)論如何HasChanged后續(xù)都會(huì)是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í)候過(guò)期
上面介紹了MSCache中的過(guò)期策略,但都是單獨(dú)使用的,其實(shí)這些過(guò)期策略可以混合使用。
比如指定 1個(gè)小時(shí)后到期或者10分鐘內(nèi)沒(méi)有命中到期。
IChangeToken當(dāng)然也是可以的。
這邊的過(guò)期策略是只要啟動(dòng)一個(gè)條件達(dá)成那么這個(gè)緩存就是無(wú)效的。
很多時(shí)候我們希望緩存過(guò)期之后能做一些事情,比如重新寫入緩存等等,MSCache提供了這樣的機(jī)制。
使用回調(diào)相關(guān)的定義
示例
關(guān)于.NET Core中MemoryCache怎么實(shí)現(xiàn)緩存過(guò)期就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。