从 MemoryCache 实例中删除大量项目的推荐方法是什么?
根据围绕这个问题的讨论,似乎首选方法是为整个应用程序使用单个缓存,并为键使用命名空间,以允许在同一实例中缓存多个逻辑类型的项目。
但是,使用单个缓存实例会导致从缓存中过期(删除)大量项目的问题。特别是在某种逻辑类型的所有项目都必须过期的情况下。
目前我找到的唯一解决方案是基于这个问题的答案,但从性能的角度来看,它真的不是很好,因为你必须枚举缓存中的所有键,并测试命名空间,这可能是相当耗时的!
目前我想出的唯一解决方法是为缓存中的所有对象创建一个带有版本号的瘦包装器,并且每当访问一个对象时,如果缓存版本与当前版本不匹配,则丢弃它。因此,每当我需要清除某种类型的所有项目时,我都会提高当前版本号,从而使所有缓存的项目无效。
上面的解决方法似乎很可靠。但我不禁想知道是否没有更直接的方法来完成同样的事情?
这是我目前的实现:
private class MemCacheWrapper<TItemType>
where TItemType : class
{
private int _version;
private Guid _guid;
private System.Runtime.Caching.ObjectCache _cache;
private class ThinWrapper
{
public ThinWrapper(TItemType item, int version)
{
Item = item;
Version = version;
}
public TItemType Item { get; set; }
public int Version { get; set; }
}
public MemCacheWrapper()
{
_cache = System.Runtime.Caching.MemoryCache.Default;
_version = 0;
_guid = Guid.NewGuid();
}
public TItemType Get(int index)
{
string key = string.Format("{0}_{1}", _guid, index);
var lvi = _cache.Get(key) as ThinWrapper;
if (lvi == null || lvi.Version != _version)
{
return null;
}
return lvi.Item;
}
public void Put(int index, TItemType item)
{
string key = string.Format("{0}_{1}", _guid, index);
var cip = new System.Runtime.Caching.CacheItemPolicy();
cip.SlidingExpiration.Add(TimeSpan.FromSeconds(30));
_cache.Set(key, new ThinWrapper(item, _version), cip);
}
public void Clear()
{
_version++;
}
}