ASP.NET MVC中的缓存

82

我想在我的asp.net-mvc网站中缓存最重的数据库操作。 在研究过程中,我找到了以下资源:

但我觉得我还没有完全理解。 我希望能够根据多个参数来缓存我的POST请求。这些参数都包含在一个对象中,因此我想缓存以下请求的结果:

public ActionResult AdvancedSearch(SearchBag searchBag)

搜索包(searchBag)是一个保存(一堆)可选搜索参数的对象。 我的视图本身很轻量级(应该如此),但数据访问可能会非常耗时,具体取决于在搜索包中填充了哪些字段。

我有一种感觉,应该在数据层上进行缓存,而不是在操作上进行缓存。 我应该如何在OutputCache属性中使用VaryByParam?


2
你尝试过使用VaryByParam="searchBag.property"吗? - Eduardo Campañó
不,我还没有。会尝试你说的方法。但是枚举几个参数怎么样? - Boris Callens
2
根据参数变化="第一个参数;第二个参数;第三个参数" - Arnis Lapsa
1
有点晚了,但是企业库缓存应用程序块已经包含在 .Net 4.0 中,所以现在你可以使用 System.Runtime.Caching 的 MemoryCache 来实现类似的效果。随处可用 :) - Carl
4个回答

74

我也喜欢在模型或数据层中进行缓存。 这将隔离与从控制器/演示检索数据有关的所有内容。 您可以从System.Web.HttpContext.Current.Cache访问ASP.NET缓存,或者使用企业库中的缓存应用程序块。 从查询的参数创建缓存数据的密钥。 更新数据时,请务必使缓存失效。


1
我想我应该学习一下Enterprise Library。 由于大多数延迟都在数据层,所以我猜这最终将是最好的解决方案。目前它是一个只读数据库,因此这缓解了陈旧对象的问题 :) - Boris Callens
17
缓存应用程序块似乎是一种过度设计。我发现在几乎每个情况下,HttpRuntime.Cache都足够使用。 - Jeff Putz
3
为什么要过度设计?我现在已经深入开发中,发现EL缓存系统非常易于使用。只需引用正确的库,添加正确的配置行,即可通过每一行代码开始缓存和检索对象。 - Boris Callens
6
我认为让一些人感到烦恼的是“添加正确的配置行”这个步骤。 - Mike Chamberlain
如果数据库有更新,如何使内存缓存失效?您是否使用服务经常进行检查,然后如何清除缓存?如果您能解释一下这个过程,那就太好了。 - Shaiju T

66

或者你可以独立于HttpContext.Current,并从HttpRuntime.Cache访问Cache :)


这也意味着当代码在后台线程上运行时(即异步/等待好处),您仍将能够访问“缓存”。 - Michael K. Campbell

12

通常,输出缓存可以是最快和最有效的,但仅当它满足您的要求时。如果错误的话,速度快效率高也没有意义! ;)

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


0

你可以使用输出缓存,就像这样

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

或者您可以在 Web.config 中设置缓存配置文件

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

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

and use this tag
[OutputCache(CacheProfile="Admin")]

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