C#中的缓存对我来说是正确的方法吗?

时间:2011-12-29 22:27:19

标签: asp.net caching sqlcachedependency

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

  1. 使用Sql Cache Dependency时......我知道你可以指定哪些表会受到监控但是如果这些表中的任何一个表发生了变化,它会重置整个缓存吗?我知道我不想缓存频繁更改的表,但我们最终会得到一些缓存的表,即使每个表每天只获得一些更新,也可能会变成50%的缓存重置每天(8小时窗口)。

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

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

  4. 有没有办法物理强制缓存重建自己?我可以看到我的老板认为缓存是针对特定问题的错误而且我需要能够在最严格的级别上排除这一点。没有“改变记录并说应该重建缓存”,而是“做[行动X]并且知道缓存中的任何东西现在都消失了”

  5. 提前感谢您的答案和时间。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

从我的头顶:

  1. 只有该表格的内容才会失效。
  2. 每个Web应用程序都有自己的缓存。
  3. 缓存存储在内存中。并查看有关缓存大小的问题How to determine total size of ASP.Net cache?
  4. http://bit.ly/vsqNDl这可能会有所帮助