我想在我们的网上商店中缓存一些数据1小时,而我正在使用Asp.Net Core 2.1
IMemoryCache
。是否可以每小时自动更新缓存?
通常,在Web用户询问已过期的缓存数据之后,将刷新缓存。但是缓存过程需要一些时间,我想确保没有用户访问“慢速”网站,因为他的请求正在重置一些缓存数据。
我找不到任何IMemoryCache
方法来做到这一点。我认为排定的任务可能每小时(+1秒?)触发一些更新功能,但是如果运气不好,排定的任务会在用户请求之后稍晚一些,而用户正在更新缓存而不是我预定的任务。
return _cache.GetOrCreate("FullNav", entry =>
{
entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1);
//calculate fullnav
return fullnav;
});
最好的方法是什么?
答案 0 :(得分:0)
您可以使用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);
修改
AbsoluteExpiration
获取或设置缓存条目的绝对到期日期。
AbsoluteExpirationRelativeToNow
获取或设置相对于现在的绝对到期时间。
AbsoluteExpirationRelativeToNow是特定于时间偏移量的,而AbsoluteExpiration是特定于日期的。
答案 1 :(得分:0)
天真的实现:
@UIScoped
// 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
该实现未考虑由于内存压力可能清除了该项目。我认为将其实现为实例化为单例的服务类可能会更好。服务类将执行相同的操作,但是将“昂贵”项保留在实例变量中。
答案 2 :(得分:0)
Panagiotis Kanavos的评论中给出的最佳答案:
在代码中:
fullnav = ''; //calculate fullnav
_cache.Set("FullNav",fullnav);
调用缓存的fullnav时,使用TryGetValue
并在缓存不可用时调用set方法是很聪明的。