具有MemoryCacheEntryOptions的内存缓存GetOrCreate

时间:2018-05-09 07:13:22

标签: caching asp.net-core

在当前实现中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或任何absoluteExpirationRelativeToNowabsoluteExpiration等日期(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以获得更多反馈。

1 个答案:

答案 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