在当前实现中IMemoryCache
接口具有以下方法:
bool TryGetValue(object key, out object value);
ICacheEntry CreateEntry(object key);
void Remove(object key);
我们可以通过以下方式查询缓存:
//first way
if (string.IsNullOrEmpty
(cache.Get<string>("timestamp")))
{
cache.Set<string>("timestamp", DateTime.Now.ToString());
}
//second way
if (!cache.TryGetValue<string>
("timestamp", out string timestamp))
{
//
cache.Set<string>("timestamp", DateTime.Now.ToString());
}
但还有另一种方法应该使用工厂参数执行缓存应该执行的操作(GetOrCreate
):
public static TItem GetOrCreate<TItem>(this IMemoryCache cache, object key, Func<ICacheEntry, TItem> factory)
{
object obj;
if (!cache.TryGetValue(key, out obj))
{
ICacheEntry entry = cache.CreateEntry(key);
obj = (object) factory(entry);
entry.SetValue(obj);
entry.Dispose();
}
return (TItem) obj;
}
如上所示,Set
方法接受MemoryCacheEntryOptions
或任何absoluteExpirationRelativeToNow
,absoluteExpiration
等日期(https://github.com/aspnet/Caching/blob/12f998d69703fb0f62b5cb1c123b76d63e0d04f0/src/Microsoft.Extensions.Caching.Abstractions/MemoryCacheExtensions.cs),但{{1} }}方法不支持该类型的每个条目到期日期&#39;当我们创建一个新条目时。
我试图弄清楚我是否遗漏了某些东西,或者我是否应该使用PR来添加这些方法。
附件:
GetOrCreate
在此处打开了一个问题:https://github.com/aspnet/Caching/issues/392以获得更多反馈。
答案 0 :(得分:1)
我不确定我是否理解正确,但您可以将您收到的条目中的所有“每个条目 - 到期日期”选项设置为工厂的参数:
string timestamp = cache.GetOrCreate("timestamp", entry =>
{
entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(5);
return DateTime.Now.ToString();
});
string timestamp = cache.GetOrCreate("timestamp", entry =>
{
entry.SlidingExpiration = TimeSpan.FromSeconds(5);
return DateTime.Now.ToString();
});
MemoryCacheEntryOptions
上提供了所有ICacheEntry
。