繁体   English   中英

更新IMemoryCache服务器端

[英]Update IMemoryCache server-side

我想在我们的IMemoryCache商店中缓存一些数据1小时,并且我正在使用Asp.Net Core 2.1 IMemoryCache 是否可以每小时自动更新缓存?

通常,在Web用户请求过期的缓存数据后,将刷新缓存。 但是缓存过程需要一些时间,我想确保没有用户访问“慢速”网站,因为他的请求正在重置一些缓存的数据。

我找不到任何IMemoryCache方法来执行此操作。 我认为排定的任务可能每小时(+1秒?)触发一些更新功能,但是如果运气不好,排定的任务会在用户请求之后稍晚一些,而用户正在更新缓存而不是我的预定任务。

return _cache.GetOrCreate("FullNav", entry =>
{
    entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1);
    //calculate fullnav
    return fullnav;
});

做这个的最好方式是什么?

您可以使用AbsoluteExpiration

DateTime cacheEntry;

// Look for cache key.
if (!_cache.TryGetValue(CacheKeys.Entry, out cacheEntry))
{
    // Key not in cache, so get data.
    cacheEntry = DateTime.Now;

    // Set cache options.
    var cacheEntryOptions = new MemoryCacheEntryOptions()
        // Keep in cache for this time, reset time if accessed.
        .SetAbsoluteExpiration(TimeSpan.FromHours(1));

    // Save data in cache.
    _cache.Set(CacheKeys.Entry, cacheEntry, cacheEntryOptions);
}

return View("Cache", cacheEntry);

GetOrCreate版本,由@Panagiotis Kavavos建议

var cacheEntry = _cache.GetOrCreate(CacheKeys.Entry, entry =>
{
    entry.AbsoluteExpiration = TimeSpan.FromHours(1);
    return DateTime.Now;
});

return View("Cache", cacheEntry);

编辑

绝对到期

获取或设置缓存条目的绝对到期日期。

AbsoluteExpirationRelativeToNow

获取或设置相对于现在的绝对到期时间。

重新引用

AbsoluteExpirationRelativeToNow是特定于时间偏移量的,而AbsoluteExpiration是特定于日期的。

天真的实现:

    // add proper code to populate
    var x = "hello";
    _cache.Set(x, NullChangeToken.Singleton);

    Task.Factory.StartNew(async () =>
    {
        await Task.Delay(TimeSpan.FromHours(1));
        // add proper code to repopulate
        var y = "new value";
        _cache.Set(y, NullChangeToken.Singleton);
    });

NullChangeToken将永远不会更改,因此该值不会自动过期。 该值将由随后对_cache.Set(...)调用替换_cache.Set(...)

该实现未考虑到由于内存压力而可能清除了该项目。 我认为将其实现为实例化为单例的服务类可能会更好。 服务类将执行相同的操作,但是将“昂贵”项保留在实例变量中。

Panagiotis Kanavos的评论中给出的最佳答案是:

  1. 使用Set()而不是GetOrCreate()来强制重置缓存,即使该缓存已经存在也是如此。 链接
  2. 不要使用到期时间,即使AbsoluteExpiration也没有必要。
  3. 创建一个计划的任务,每x次调用此方法

在代码中:

fullnav = ''; //calculate fullnav
_cache.Set("FullNav",fullnav);

调用缓存的fullnav时,使用TryGetValue并在缓存不可用时调用set方法是很聪明的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM