4

在我的项目中,我们使用 Web 服务从数据库中获取数据,并将来自 Web 服务的数据填充到缓存中。我正在使用 Absolute expiration ,并且持续时间设置为 4 小时。因此 4 小时后,缓存过期,因此调用 Web 服务重新填充缓存中的数据。

现在发生的问题是:

有时在 Web 服务和数据库之间建立连接时出现问题,因此 Web 服务不返回数据。

在这种情况下,缓存将填充所有字段的空值,并且最多 4 小时的缓存(直到它再次过期)不会重新填充。

我正在寻找两种解决方案:1)我们可以在缓存到期之前更新缓存,然后调用 Web 服务。如果 Web 服务取回数据,则覆盖缓存。2)缓存永远不会过期,如果我们取回数据,我们经常会产生一个更新缓存的线程。

但我不确定如何实施上述解决方案?有人可以给我关于技术部分的见解吗?谢谢您的帮助!

我当前填充缓存的代码:

ctx.Cache.Insert("cachename", cacheValue, null,
              DateTime.Now.AddHours(Int32.Parse(siteViewModel.ApplicationSettings["CacheDurationHours"])), System.Web.Caching.Cache.NoSlidingExpiration, 
             System.Web.Caching.CacheItemPriority.Default,
             null
             );
4

1 回答 1

4

不要传递 null,而是实现CacheItemRemovedCallback作为Cache.Insert(..)的最后一个参数。在检索值以重新填充缓存时,您可以进行空检查并暂时使用旧值。

于 2012-09-28T22:07:00.920 回答