什么更好:通过HttpContext.Current.Cache进行缓存还是仅使用静态缓存?

5
昨晚我编写了我的第一个IHttpModule来处理一些请求。我使用正则表达式来检查原始url。IHttpModule将在每个请求时被调用,因此似乎有道理做一些缓存的正则表达式对象以防止在每个请求上创建它。
现在我的问题是...什么更好:使用HttpContext.Current.Cache来存储实例化的对象还是在我的模块中使用一个private static Regex?
我期待您给出原因。只为澄清:正则表达式永远不会改变,因此始终是相同的东西。
3个回答

11

如果正则表达式不会改变(通常情况下是这样的),那么:

private static readonly Regex pattern = new Regex("...", RegexOptions.Compiled);

在各个方面都是最快和最有效率的


但是如果进程回收,pattern 不会为空的风险吗? - Aliostad
3
@Aliostad - 不是。由于它是该类的静态属性,所以当首次引用该类时,它将被重新创建。 - tvanfosson

3
我想这要看情况而定。内置缓存可以为您提供自动过期控制,而静态对象则无法做到。此外,如果您想更改缓存机制(比如说您要分发您的应用程序),使用内置缓存是可行的。静态对象只是静态的。

1
在真实场景下,对于简单的正则表达式来说,使用这种方式可能过于夸张。 - Marc Gravell
1
@Marc - 我甚至可以说这是一种代码异味(Speculative Generality?)。你创建了一个不必要存在的依赖关系,即本应该是静态属性的数据现在成为了一个无关类中的数据。 - tvanfosson

3

通常情况下,我会使用静态字段,并在需要更多控制对象生命周期时使用缓存。以下是我能够想到的两个原因:

  • 始终会涉及一些开销来缓存对象并从缓存中检索它,至少会有装箱/拆箱操作
  • 您必须通过缓存键访问项目,而不是直接在代码中访问,这使应用程序变得更加臃肿和难以理解

您应该问自己是否需要通过缓存对象获得功能,即生命周期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接