6

我试图阅读 ASP.NET 中的缓存,但仍有一些问题。

  1. 使用 Sql Cache Dependency 时...我知道您可以指定将监视哪些表,但是如果这些表中的任何一个发生更改,它会重置整个缓存吗?我知道我不想缓存会频繁更改的表,但我们最终可能会得到大量缓存表,即使每个表每天只更新几次,这可能会导致缓存重置 50 次每天(8 小时窗口)。

  2. 我将通过 GAC DLL 创建和维护此缓存。任何时候都会有大量不同的应用程序访问该 GAC。每个应用程序是否维护自己的缓存副本,还是仅存储在一个全局位置(或可能每个应用程序池)?

  3. 服务器上是否有可以查看缓存当前占用多少空间的物理位置?如果每个应用程序都维护自己的缓存,这将非常相关,因为这最终可能会占用大量磁盘空间。

  4. 有什么方法可以物理强制缓存自行重建吗?我可以看到我的老板假设缓存因某个特定问题而存在故障,我需要能够从根本上排除这种情况。没有“更改记录并说应该重建缓存”,而是“执行 [Action X] 并知道缓存中的任何内容现在都消失了”

提前感谢您的回答和时间。

4

2 回答 2

2
  1. SqlCacheDependency 仅监视旧式 SQL 2000 方法中的表,该方法依赖于触发器和轮询。SQL 2005+ 方法监视行级别的更改,并使用 Service Broker。在 Cache 对象级别,更改只会使与给定 SqlCacheDependency 关联的 Cache 条目(而不是整个缓存)无效。

  2. 每个应用程序都有一个单独的缓存副本。如果您有许多应用程序共享相同的数据,您可能会考虑创建一个单独的“缓存服务器”,并让您的应用程序使用 WCF 从那里获取数据——基本上是为您的应用程序添加另一个层。

  3. 您可以查看几个与缓存相关的性能计数器,但如果您关心的是磁盘空间,则无需担心,因为 ASP.NET 缓存完全存储在 RAM 中。此外,如果 RAM 太满,缓存的一个特性是它会放弃旧的/不经常引用的对象,为新对象腾出空间。

  4. 强制删除缓存的最简单方法是简单地回收您的应用程序或 AppPool(无论如何默认情况下每天都会发生一次)。如果您想要更有针对性的东西,您需要编写一些代码来强制从缓存中删除某些项目,或者使用 Cache.Remove() 或使用链接的依赖项。

于 2011-12-29T23:41:21.583 回答
1

从我的头顶:

  1. 只有该表的内容会失效。
  2. 每个 Web 应用程序都有自己的缓存。
  3. 缓存存储在内存中。并看到这个问题如何确定 ASP.Net 缓存的总大小?关于缓存大小
  4. http://bit.ly/vsqNDl这可能会有所帮助
于 2011-12-29T22:41:02.653 回答