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

C# 在到期时自动重新填充缓存,c#,.net,caching,C#,.net,Caching,我当前缓存方法调用的结果 缓存代码遵循标准模式:它使用缓存中的项(如果它存在),否则它计算结果,在返回它之前缓存它以备将来调用 我希望保护客户端代码不受缓存未命中的影响(例如,当项目过期时) 我正在考虑生成一个线程来等待缓存对象的生存期,然后在现有项过期时(或之前)运行提供的函数来重新填充缓存 任何人都可以分享与此相关的经验吗?这听起来是明智的做法吗 我使用的是.NET 4.0。因为这是ASP.NET,所以该方法允许您指定回调委托 这听起来是明智的做法吗 是的,回调(和文件依赖)正是针对这种情况

我当前缓存方法调用的结果

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

我希望保护客户端代码不受缓存未命中的影响(例如,当项目过期时)

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

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


我使用的是.NET 4.0。

因为这是ASP.NET,所以该方法允许您指定回调委托

这听起来是明智的做法吗


是的,回调(和文件依赖)正是针对这种情况提供的。您仍然需要在资源、延迟和过时之间进行权衡

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

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

var value = cache.GetOrAdd(someKey, key => MyMethod(key));
var cache=newConcurrentDictionary();
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;
var cache=newConcurrentDictionary();
var value=cache.AddOrUpdate(someKey,
key=>Tuple.Create(MyMethod(key),DateTime.Now),
(键,值)=>(value.Item2+生存期

这有帮助吗?

为了立即重新创建对象而使对象过期似乎没有任何意义。只需关掉呼气;dtb展示了如何使用它。

对.NET Framework 4.0的新添加是

引用文件:

MemoryCache类类似于 ASP.NET缓存类。这个 MemoryCache类有许多属性 以及访问缓存的方法 如果你愿意,你会很熟悉的 已使用ASP.NET缓存类


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

我将在asp.net中使用缓存。我把这个问题留给了一个技术上相对不可知的问题,因为我觉得这个方法相对独立于技术。我正在研究这个问题,并考虑使用System.Timers.Timer,而不是在到期前生成一个新线程和刷新。但是它从来不会刷新任何东西eitherOK,很好的补充。但是ASP缓存也有一个优先级机制abs超时、滑动超时、默认值等等。。。(仍然+1:)我通常更喜欢让一个值在旧值过期后,然后推迟获取新值,直到它真正需要为止。@Steven:这让对OP的情况有太多的假设。@Henk:也许吧,但你描述的不是缓存,而是快照。例如,如果我有一个很少更改的数据表,例如美国的州列表,我不想每次都访问数据库,但我也不想永远缓存该列表,因为,嘿,事情变了。因此,我生成一个快照,该快照在一段合理但任意的时间(一小时、一天)后过期,然后用一个新快照替换它。那不是缓存。缓存将保留过期的值,只是为了给更有用的值腾出空间,并根据需要解决未命中的值。刷新呢?这是缓存的另一个功能。旧对象如何比新对象更糟糕?如果不是,那就别管它了。另一方面,如果OP有一个简单的包装器,相当于“如果可能,从缓存中获取它,否则创建它并顺便将它添加到缓存中”,这将是很好的。如果它是静态计算,那么您是对的。但是考虑一个查询或WebService。缓存通常是性能和新鲜度之间的权衡。OP解决了另一个问题:防止缓存未命中您无法防止缓存未命中。这就是为什么它被称为缓存。@Henk:对不起,又忘了前缀。链接不错,我不知道。但AddOrGetExisting仍将被视为缓存未命中,Ben应使用回调。这似乎得到了支持。正如我所设想的,这回答了我最初的问题。我不确定史蒂文·苏迪特(Steven Sudit)在缓存和快照之间所做的区分是否有用(我以前从未遇到过这种区分)。我有兴趣了解更多。在回拨时,您知道当前的http上下文有没有优雅的方法?