溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

發(fā)布時間:2021-06-08 16:14:20 來源:億速云 閱讀:253 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細講解有關(guān).NET Core中MemoryCache怎么實現(xiàn)緩存過期,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

MSCache項目

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提供了以下三種緩存過期的方式

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

下面我們來一一看看這些方式。

絕對時間到期

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

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

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

這邊的第一個方法定義中的 relative 是指從當前時間度過這么久的時間之后過期,類似 DateTime.Now.Add(relative)。

為什么說類似呢?

因為每個國家地區(qū)的時間可能不一致,MSCache默認使用了UTC時間,這個時間可以在options進行修改,后面在做介紹。

滑動時間到期

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

除了前兩次迭代滿足2秒內(nèi)命中緩存,剩余的3次迭代無法滿足2秒內(nèi)命中,所以從第三次迭代開始緩存項都會過期。

自定義過期策略

很多時候我們的緩存過期條件并不是只有時間,比如我們對一個文件內(nèi)容進行了緩存,當文件變動的時候需要重新加載文件更新緩存。再比如我們緩存了用戶信息,在一個bus上接收到了用戶信息變動后清除用戶緩存并重新緩存用戶。

MS為我們提供了一個非常簡單的自定義過期策略。

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

IChangeToken

IChangeToken不完全為MS而生,而是一個基礎(chǔ)包里面的接口,所以在理解這個接口的時候盡量不要帶入緩存來考慮。

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

HasChanged 顧名思義,用來返回是否發(fā)生了變更,在MSCache中如果返回了true則緩存項將會失效。

ActiveChangeCallbacks 一個有點玄學(xué)的屬性,該屬性更多是一種描述,字面意思是該token是否會激活回調(diào),取決于IChangeToken實現(xiàn)者的邏輯,如果這個值返回false則不要期望通過IChangeToken的RegisterChangeCallback來達到發(fā)生變更的時候有回調(diào)通知。

RegisterChangeCallback 注冊一個回調(diào),當變更發(fā)生時執(zhí)行,一般配合ActiveChangeCallbacks來達成。

一個約束并不是強制

ActiveChangeCallbacks 為 true 時通過RegisterChangeCallback 注冊的回調(diào)會在發(fā)生變更時被回調(diào)執(zhí)行,反之相反。

MS其它組件實現(xiàn)的IChangeToken

CancellationChangeToken (一個對CancellationToken的包裝)

CompositeChangeToken (組合ChangeToken,可以將多個ChangeToken包裝成一個Token)

ConfigurationReloadToken (配置重新加載Token,來自MS.Configuration組件)

PollingFileChangeToken (通過輪訓(xùn)來監(jiān)控文件變更)

PollingWildCardChangeToken (通過輪訓(xùn)來監(jiān)控文件變更,這個是支持通配符的)

……

緩存一個文件,并在文件變化時候更新緩存內(nèi)容

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

手動過期緩存

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

ChangeToken的一次性

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

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

實際輸出結(jié)果 1 1 2 3

為什么?

因為我們之前講到ChangeToken是通過HasChanged來判斷緩存是否過期的。

在這邊我們調(diào)用了cts的Cancel,那么無論如何HasChanged后續(xù)都會是true,因為cts的Cancel是不可逆的。

正確的做法

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

這邊正確的做法只是強調(diào),ChangeToken是一次性的,具體如何達到這個目的大家可以自由發(fā)揮。

自定義一個ChangeToken,當當前時間的分數(shù)為偶數(shù)時候過期

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

過期策略組合拳

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

比如指定 1個小時后到期或者10分鐘內(nèi)沒有命中到期。

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

IChangeToken當然也是可以的。

這邊的過期策略是只要啟動一個條件達成那么這個緩存就是無效的。

緩存過期回調(diào)

很多時候我們希望緩存過期之后能做一些事情,比如重新寫入緩存等等,MSCache提供了這樣的機制。

使用回調(diào)相關(guān)的定義

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

示例

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

寫在最后

.NET Core中MemoryCache怎么實現(xiàn)緩存過期

關(guān)于.NET Core中MemoryCache怎么實現(xiàn)緩存過期就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI