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