数据库缓存失效策略和时机
Database cache invalidation strategy and timing
如果您使用以下策略:
- 用于存储 SQL 查询的应用程序级缓存(如 System.Web.Caching.Cache)。
- 每个缓存条目都存储有与返回行的主键相关联的 CacheDependancy。
- 一个数据库侦听器,它侦听更改并在它所依赖的行更改时使特定查询的缓存无效。
这工作得很好,但缓存显然不会立即失效,这在少数情况下是有问题的。
一个例子是当用户将产品添加到购物车时。用户将被带到一个显示购物车内容的新页面。在这种情况下,缓存没有及时失效,新添加的项目将不会出现。如果您重新加载页面,听众有时间 运行 并且项目现在就在那里。
我正在努力寻找通用的解决方案。这是缓存失效的缺点还是我遗漏了什么?
不太可能有适用于所有缓存场景的通用解决方案,您最好使用 Session / HttpContext 等常用方法针对您的应用程序定制解决方案,具体取决于您需要缓存对象的持续时间。
可以将购物车项目放入会话中,可以使用 HttpContext.Current.Items 仅在请求持续时间内缓存的项目等。更常见的是 CacheDependency 用于不经常更改的更多静态项目,因此延迟没关系。
如果您使用以下策略:
- 用于存储 SQL 查询的应用程序级缓存(如 System.Web.Caching.Cache)。
- 每个缓存条目都存储有与返回行的主键相关联的 CacheDependancy。
- 一个数据库侦听器,它侦听更改并在它所依赖的行更改时使特定查询的缓存无效。
这工作得很好,但缓存显然不会立即失效,这在少数情况下是有问题的。
一个例子是当用户将产品添加到购物车时。用户将被带到一个显示购物车内容的新页面。在这种情况下,缓存没有及时失效,新添加的项目将不会出现。如果您重新加载页面,听众有时间 运行 并且项目现在就在那里。
我正在努力寻找通用的解决方案。这是缓存失效的缺点还是我遗漏了什么?
不太可能有适用于所有缓存场景的通用解决方案,您最好使用 Session / HttpContext 等常用方法针对您的应用程序定制解决方案,具体取决于您需要缓存对象的持续时间。
可以将购物车项目放入会话中,可以使用 HttpContext.Current.Items 仅在请求持续时间内缓存的项目等。更常见的是 CacheDependency 用于不经常更改的更多静态项目,因此延迟没关系。