我想永远缓存某些值,并希望确保它们在我访问它们时就在那。

目前,我使用以下代码:

ObjectCache objectCache = MemoryCache.Default;
CacheItemPolicy policy = new CacheItemPolicy() { AbsoluteExpiration = ObjectCache.InfiniteAbsoluteExpiration };

objectCache.Set(new CacheItem("anykey", anyobject), policy);


在MSDN上的文档中,有关设置ObjectCache.InfiniteAbsoluteExpiration的内容如下:


  但是,具有此设置的缓存条目可以从缓存中逐出
  由于特定的高速缓存确定的其他原因
  实施,例如由以下原因导致的变更监视器事件驱逐
  记忆压力。


资料来源:https://msdn.microsoft.com/en-us/library/system.runtime.caching.objectcache.infiniteabsoluteexpiration(v=vs.110).aspx

这是否意味着,如果我的Windows服务因OutOfMemoryException崩溃而清除了所有缓存值?

最佳答案

简短的答案是:是的,即使您使用InfiniteAbsoluteExpiration,也可以驱逐或清除缓存值。

如果您的程序无法处理丢失的缓存值(可能应该这样),那么您需要处理这样的情况:无论OutOfMemoryExceptions是什么,为了驱逐而删除一个项目。 MemoryCache(作为ObjectCache的一部分)具有一个UpdateCallback委托,可以这样设置:

private void PopulateCache(Widget value)
{
    var policy = new CacheItemPolicy();
    policy.UpdateCallback = CacheUpdate;
    _cache.Set(GetCacheItemKey(value), value, policy);
}

private void CacheUpdate(CacheEntryUpdateArguments args)
{
    // if expired or evicted, put it back in!
    if (args.RemovedReason == CacheEntryRemovedReason.Expired || args.RemovedReason == CacheEntryRemovedReason.Evicted)
    {
        _cache.Set(args.Key, _cache[args.Key], CacheItemPolicy);
    }
    // if removed or ChangeMonitorChanged, do nothing
}


有关更多信息,请查看:https://msdn.microsoft.com/en-us/library/dd988702(v=vs.110).aspx

但是,作为最佳实践,典型的模式是,当您从缓存中检索值时,如果该项目已过期/被驱逐,则应从数据存储中获取该项目并重新填充缓存。

10-06 12:50