在到期时自动重新填充缓存

时间:2010-09-14 17:30:13

标签: c# .net caching

我目前正在缓存方法调用的结果。

缓存代码遵循标准模式:它使用缓存中的项目(如果存在),否则它会计算结果,在返回之前将其缓存以供将来调用。

我想屏蔽客户端代码以防止缓存未命中(例如,当项目已过期时)。

我正在考虑生成一个等待缓存对象生命周期的线程,然后运行一个提供的函数,以便在现有项目到期时(或之前)重新填充缓存。

任何人都可以分享与此相关的经验吗?这听起来像是一种明智的做法吗?

我正在使用.NET 4.0。

4 个答案:

答案 0 :(得分:4)

由于这是ASP.NET,Cache.Insert()方法允许您指定回调委托。

  

这听起来像是一种明智的做法吗?

是的,回调(和文件依赖)是为这种情况提供的。你仍然需要在资源,延迟和过时之间进行交易。

答案 1 :(得分:4)

.NET Framework 4.0的新增功能是MemoryCache Class

来自文档的引用:

  

MemoryCache类与   ASP.NET Cache类。该   MemoryCache类有很多属性   以及访问缓存的方法   如果你熟悉的话   使用了ASP.NET Cache类

如果不存在,您可以使用AddOrGetExisting方法来获取或创建CacheItem。

答案 2 :(得分:2)

这是一个永不过期的缓存:

var cache = new ConcurrentDictionary<TKey, TValue>();

var value = cache.GetOrAdd(someKey, key => MyMethod(key));

这有帮助吗?


这是一个永不过期的缓存,并在一定生命周期后刷新该值:

var cache = new ConcurrentDictionary<TKey, Tuple<TValue, DateTime>>();

var value = cache.AddOrUpdate(someKey,
             key => Tuple.Create(MyMethod(key), DateTime.Now),
    (key, value) => (value.Item2 + lifetime < DateTime.Now)
                  ? Tuple.Create(MyMethod(key), DateTime.Now)
                  : value)
                  .Item1;

这有帮助吗?

答案 3 :(得分:0)

对象过期似乎没有任何意义,只是立即重新创建它。关闭过期; dtb显示了如何。