System.Runtime.Caching Absolute Expiration 按设计驱逐数据,但如何实现非驱逐过期数据策略?

Posted

技术标签:

【中文标题】System.Runtime.Caching Absolute Expiration 按设计驱逐数据,但如何实现非驱逐过期数据策略?【英文标题】:System.Runtime.Caching Absolute Expiration evicts data as designed, but how to implement a non-evicting expiring data strategy? 【发布时间】:2012-03-17 14:52:40 【问题描述】:

我在我的 MVC3 应用程序中使用 System.Runtime.Caching MemoryCache 来缓存很少更改但经常访问的数据。我已将 absoluteExpiration 设置为 30 分钟。这很好用。每隔 30 分钟,应用程序会使缓存中的数据过期,然后驱逐数据。

下次查询数据时,系统会从数据库中重新加载缓存。

但是,如果在缓存被驱逐后数据库暂时不可用怎么办?这将导致 MemoryCache 或数据库中没有可用的记录。理想的做法是使缓存过期,但在确定可以重新加载数据之前不要驱逐数据。如果我无法从数据库重新加载数据,我想将缓存的过期时间延长 5 分钟左右,然后再试一次。最终数据库将恢复。

策略是我宁愿有稍微陈旧的数据也不愿完全没有数据。

我的问题是我应该如何使用 System.Runtime.Caching 创建这样的缓存策略。我没有看到允许我在到期时防止被驱逐的事件。有什么想法吗?

【问题讨论】:

【参考方案1】:

我认为您需要实现自己的 OutputCacheProvider,它可以让您准确控制从缓存中删除项目时会发生什么:

http://msdn.microsoft.com/en-us/library/system.web.caching.outputcacheprovider.aspx

您还可以考虑更改策略并查看 SqlCacheDependency,如果数据库不可用,我认为这不会使缓存项失效。

http://msdn.microsoft.com/en-us/library/system.web.caching.sqlcachedependency.aspx

【讨论】:

感谢您的信息。好东西!

以上是关于System.Runtime.Caching Absolute Expiration 按设计驱逐数据,但如何实现非驱逐过期数据策略?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 System.Runtime.Caching.ObjectCache 中的缓存策略?

System.Runtime.Caching.MemoryCache vs HttpRuntime.Cache - 有啥区别吗?

如何清除System.Runtime.Caching.MemoryCache

System.Runtime.Caching Absolute Expiration 按设计驱逐数据,但如何实现非驱逐过期数据策略?

HttpContext.Current.Cache和HttpRuntime.Cache的区别,以及System.Runtime.Caching

System.Runtime.Caching.MemoryCache可以在生产中的用户之间保持应用程序