我不知道我应该使用 httpcontext 缓存还是企业库缓存应用程序块。此外,在删除或更新属于缓存列表的实体时,缓存策略的最佳模式是什么?
我应该从缓存中删除所有列表还是只从缓存列表中删除该项目?如果我更新它,我将从缓存中删除列表或更新其中的实体。
我不知道我应该使用 httpcontext 缓存还是企业库缓存应用程序块。此外,在删除或更新属于缓存列表的实体时,缓存策略的最佳模式是什么?
我应该从缓存中删除所有列表还是只从缓存列表中删除该项目?如果我更新它,我将从缓存中删除列表或更新其中的实体。
在对两者进行了一些测试后,我在我们的代码上下文中对缓存应用程序块进行了全面审查,并在博客中记录了我的经验。它使用起来非常简单,功能强大,足以满足我们的需求。我会推荐它,我的结果被记录在这里。
在您的位置上,我将使用存储库模式来维护我的缓存,它适用于数据库数据集,并且应该同样适用于您自己的缓存。如果您不熟悉存储库模式,请查看 Steven Walther 的这篇文章。. 但是,我倾向于不同意先前的答案,只取出您需要修改的项目,其余的保持不变。如果您愿意,这将允许您独立于整个列表使缓存中的项目过期。
有几种实现缓存的方法,httpcontext 是最简单的一种,但不一定是最差的。看看memcached或MS Velocity,它们都可以用作 ASP.NET 缓存的后端。尤其是 memcached 以做得非常好而闻名。
至于缓存策略:你必须决定什么最适合你。我个人会在更新/删除时从缓存中删除完整列表,而不是试图找出实体是否在列表中,因为它需要一个不平凡的您需要考虑并发问题(锁定列表,因为有人可能会更新/删除另一个实体)。有时在适当的位置更新实体确实有意义(如果您有一个包含所有需要的数据的完整对象),有时这是浪费时间,因为由于某些状态更改,实体应该移动到其他地方(例如,当您排序时LastChangedDate 等)
不要忘记优化您的数据库代码,以便刷新刷新列表不会花费太多时间。
只需在要缓存的每个操作甚至控制器上使用 [OutputCache(Duration=10, VaryByParam="none")] 即可。