IMemoryCache & IChangeToken 紀錄
試作紀錄。
IMemeryCache 試用紀錄
(1) IMemoryCache 最基本應用,
[Inject] IMemoryCache _cache { get; init; }
var meta = GetAuthInfo();
_cache.Set<AuthInfo>("AuthInfo", meta, TimeSpan.FromMinutes(20));
// 存入 MemoryCachae 一份資料,有效期限20分鐘。
(2) IMemoryCache 的資料可以到期前失效(取消)。比如最新的值已經改變了但還沒有使用所以 cache 尚未刷新,但必需標註已失效。其中CancellationChangeToken
類別實作了IChangeToken
介面。
using System.Threading;
var meta = GetAuthInfo();
var cancelSrc = new CancellationTokenSource(TimeSpan.FromMinutes(20));
_cache.Set<AuthInfo>("AuthInfo", meta
, new CancellationChangeToken(cancelSrc.Token));
// 存入 MemoryCachae 一份資料,有效期限20分鐘,
// 可以到期前取消。
(3) IMemoryCache 的資料可以到期前失效(取消),並在被驅逐時發出 evnet 。 ※當時間過期(expired)只是設定成無效還沒移除,直到下一筆資料取代才會被驅逐(eviction)。
using System.Threading;
var meta = GetAuthInfo();
var cancelSrc = new CancellationTokenSource();
var option = new MemoryCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromMinutes(20))
.RegisterPostEvictionCallback(CacheEvictionHandler, this)
.AddExpirationToken(new CancellationChangeToken(cancelSrc.Token));
_cache.Set<int>("Counter", meta, option);
// 存入 MemoryCachae 一份資料,有效期限20分鐘,
// 可以中途取消。
// 當資料被驅逐(Eviction)時觸發訊息。注意:不是過時(expired)觸發是被驅逐(Eviction)時觸發。
// ※當時間過期,只是設定成無效還沒移除,直到下一筆資料取代才會被驅逐。
/// Memory Cache 被驅逐(Eviction)時觸發。
void CacheEvictionHandler(object key, object value, EvictionReason reason, object state)
{
Log.Trace($"Cache Eviction >> time:{DateTime.Now:HH:mm:ss}, reason:{reason}, key:{key}, value:{value}, state:{state}");
}
(4) IMemoryCache 的資料只要被讀取就延續生命。
Absolute Expiration: 絕對到期,時間一到就立刻無效化。
Sliding Expiration 滑動到期,時間到期前若有讀取就再延期。 若有設定 Absolute Expiration 那 Sliding Expiration 就無效。
using System.Threading;
var meta = GetAuthInfo();
var option = new MemoryCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromMinutes(3));
_cache.Set<int>("Counter", meta, option);
// 存入 MemoryCachae 一份資料,有效期限3分鐘。
// 只要被讀取,生命再延長3分鐘。
// ※ 其中 AbsoluteExpiration 有設定的話,SlidingExpiration 就會無效。
小結
IChangeToken
現在找到的都是特殊應用,還都是用來中斷(取消)目的對象。這與其野心相差太遠。
IMemoryCache
應用上就真的只能當cache用而已,算是中規中矩。
Last updated