2011-12-29 68 views
6

我试着去了解ASP.NET中的缓存,但仍然有几个问题。C#中的缓存是否适合我?

  1. 当使用SQL缓存依赖......我知道,你可以指定哪些表进行监控,但如果发生变更这些表中的任何一个它重置整个缓存?我知道我不希望缓存经常发生变化的表,但我们最终可能会得到一些缓存表,即使每个表每天只能获得一些更新,也可能会变成50个缓存的重置每日(8小时窗口)。

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

  3. 服务器上有物理位置,我可以看到缓存当前消耗了多少空间?如果每个应用程序都保留自己的缓存,这可能会非常贴切,因为这可能会占用大量的磁盘空间。

  4. 有没有某种方法来物理强制缓存重建自己?我可以看到我的老板认为高速缓存对于特定问题存在错误,我需要能够在最高级别排除这一问题。无“更改记录,并说应该重建缓存”,而是“做[动作X],知道,无论是在高速缓存中现在没有了”

预先感谢您的回答和时间。

+0

您提出了一些有趣的问题,但我不太清楚它与您的问题的标题之间的关系。 – 2011-12-29 22:37:17

+0

和c#标记.. – 2011-12-29 22:39:05

+0

2害怕我.... – Phill 2011-12-29 22:41:19

回答

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

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

  3. 你可以看看几个与缓存相关的性能计数器,但是如果你关心的是磁盘空间,那么没有什么可担心的,因为ASP.NET缓存完全存储在RAM中。另外,如果RAM变得太满,缓存的一个特点是它会放弃旧的/不经常引用的对象,为新对象腾出空间。

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

1

从我的头顶:

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

如果表中有外键,它是否也会使这些表的缓存无效?我没有使用Sql Cache依赖关系,所以我对此感到好奇,如果没有,我可以看到新项目的一些用途。 – Brian 2011-12-29 22:47:24