在asp.net-mvc中缓存


82

我想将最繁重的数据库操作缓存在asp.net-mvc站点中。在我的研究中,我发现

  • 菲尔博客上的甜甜圈缓存
  • 在Kazi的博客上缓存/压缩过滤器
  • 斯科特·汉斯勒曼(Scott Hansleman)关于他们如何在SO中缓存内容的播客。

但是我还不明白。
我希望能够根据几个参数来缓存我的POST请求。这些pars在对象中。所以我想缓存以下请求的结果:

public ActionResult AdvancedSearch(SearchBag searchBag)

其中searchBag是一个对象(包含一堆)可选搜索参数。我的视图本身很轻巧(应该如此),但是数据访问可能非常耗时,具体取决于搜索包中填写的字段。

我觉得我应该在数据层上缓存,而不是在动作上。
我应该如何在OutputCache属性中使用VaryByParam?


2
您是否尝试过VaryByParam =“ searchBag.property”?
EduardoCampañó08年

不,我没有。会尝试你说的。但是如何枚举几个参数呢?
鲍里斯·卡伦斯

2
VaryByParam =“ firstParam; secondParam; thirdParam”
Arnis Lapsa,2009年

1
有点晚了,但是.Net 4.0中包含企业库缓存应用程序块,因此现在您可以使用System.Runtime.Caching的MemoryCache达到类似的效果。任何地方都可以:)
卡尔

Answers:


74

我也喜欢在模型或数据层中进行缓存。这样可以隔离所有与从控制器/表示中检索数据有关的事情。您可以System.Web.HttpContext.Current.Cache从企业库访问ASP.NET缓存或使用企业库中的缓存应用程序块。根据查询的参数为缓存的数据创建键。更新数据时,请确保使缓存无效。


1
我应该阅读我认为的企业库。由于大多数延迟都在数据层,我想这最终将是最佳解决方案。当前它是一个只读数据库,因此可以缓解过时的对象问题:)
Boris Callens

17
缓存应用程序块似乎完全是一团糟。我发现在几乎每个实例中HttpRuntime.Cache都绰绰有余。
Jeff Putz

3
为什么要大刀阔斧?现在,我对开发进行了很多研究,发现EL的缓存系统非常易于使用。参考正确的库,添加正确的配置行,您就可以开始缓存和检索对象,每行只需一行代码。
鲍里斯·卡伦斯

6
我认为是“添加正确的配置行”步骤使某些人不满意。
Mike Chamberlain 2012年

如果您还可以解释在数据库中有更新时如何使内存缓存无效,是否使用服务进行经常检查,然后如何清除缓存,那将是很好的选择
shaijut


12

通常,只有在满足您的要求时,OutputCaching才能最快,最高效地进行。如果这是错误的,那么没有效率就没有意义!;)

在这种情况下,听起来像在数据层进行缓存是正确的,因为您有复杂的缓存需求。有时,如果控制缓存哪些输出的参数集很简单,则可以将两者结合起来。


0

您可以使用输出缓存这样的东西

[OutputCache(Duration = 10, VaryByParam = "empID")]
      public ActionResult GetEmployeeDetail(int empID)
      {
          Employee e = new Employee();
          return Content(e.getEmployeeDetails(empID));
      }

或者您可以使用缓存配置文件在Web配置中进行设置

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="Admin" 

        duration="86420" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

and use this tag
[OutputCache(CacheProfile="Admin")]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.