我在Web服务集成层中使用System.Runtime.MemoryCache
来保留一些外部且检索速度慢的产品列表。但是,我希望刷新那些过期,以免我的呼叫者等待它。出于这个原因,我使用IIS7.5预先缓存此缓存,并在过期时重新加载数据RemovedCallback
。
然而,当Web池进程优雅地死亡时会发生什么? MemoryCache是一次性的,因此它会将我的对象踢出去,此时我会尝试重新填充一个新实例,同时将整个过程置于保持状态。有没有办法让我安全地检测到我不应该重新加载数据?
internal class ProductCache {
private static object _lock = new object();
private static string _cid = Guid.NewGuid().ToString();
public static Product[] data
{
get
{
lock (_lock)
{
if (!MemoryCache.Default.Contains(_cid))
{
Product[] p;
try
{
// load data into p
}
catch (System.Exception e)
{
Helper.SafeSendExceptionEmail("Integrator.Caching", e);
throw e;
}
MemoryCache.Default.Add(_cid, p, new CacheItemPolicy()
{
AbsoluteExpiration = DateTimeOffset.Now.AddHours(8),
RemovedCallback = arg =>
{
// query again to force reload
var d = data;
}
});
}
return (Product[])MemoryCache.Default[_cid];
}
}
}
}
答案 0 :(得分:1)
好的,通过挖掘MemoryCache
和MemoryCacheStore
源代码,似乎缓存是在域卸载时自动处理的,此时它会处理所有存储,然后使用{删除缓存项{1}}原因。这个原因并没有在其他任何地方使用,因此它必须代表“我正在死”的原因(尽管在文档中它们可能更清晰)
CacheSpecificEviction