【问题标题】:MVC3 data caching techniquesMVC3 数据缓存技术
【发布时间】:2012-01-19 02:35:04
【问题描述】:

我有一个 sql 查询(存储过程),在结果显示在 webgrid 之前大约需要 8-10 秒才能返回。关于在 asp.net-mvc3 中进行缓存的最佳性能实践是什么,这样用户就不必每次都花费 8-10 秒来加载该数据(较少优化查询)?

【问题讨论】:

    标签: asp.net asp.net-mvc linq asp.net-mvc-3 entity-framework


    【解决方案1】:

    您可以使用MemoryCache 类将此查询的结果存储在某个键下。关键可能是查询条件的散列(如果有的话)。这里是 MSDN 上的some guides,了解如何使用它。

    在实现缓存时,请记住此缓存默认存储在内存中。这意味着如果您在 Web 场中运行此应用程序,使用分布式缓存可能会更有趣,以便场的所有节点共享相同的缓存数据。这可以通过使用一些分布式缓存解决方案扩展ObjectCache 类来完成。例如memcached 是一个流行的,它有.NET provider。另一个分布式缓存解决方案是AppFabric

    【讨论】:

    • MemoryCache 可能是正确的解决方案,但我有一些场景会自动从缓存中逐出对象(使用 MVC 3)。您对此有何建议?是否需要任何特定配置才能使其与 MVC 一起使用?哦,如果你想试一试,你能读一下*.com/questions/7849000/…吗?我仍在与这个问题作斗争,无法理解我失败的地方。 :( 谢谢。
    • @BigMike,您可以在将对象存储到缓存中时指定过期策略。您可以定义绝对过期、滑动过期、更改监视器……非常灵活。
    • 是的,我可以,我已经尝试过滑动到期和绝对时间到期。在某些情况下,我显然无缘无故地驱逐了所有东西。有趣的是,在我的删除回调中,我得到了 CacheSpecificEviction 的原因,但找不到真正驱逐的人。
    【解决方案2】:

    它正在缓存这个动作。

    [OutputCache(Duration = 300)]
    public ActionResult Action(){
    
    //some operation
    
    return View()
    }
    

    【讨论】:

    • 这将缓存整个动作(例如,该动作甚至不会被执行),因此即使数据发生变化,它也不会在接下来的 5 分钟内执行。有时它会有所帮助,但在访问数据时我不想使用它。
    【解决方案3】:

    此存储过程背后的基础数据多久更改一次?如果比较少,可以使用非常好的特性——SqlCacheDependency

    http://msdn.microsoft.com/en-us/library/ms178604.aspx

    这样你的重型 SP 只会在需要的时候被调用,并且结果会被尽可能长的缓存。

    【讨论】:

    • 感谢您的回复。这可能需要大约每 3-4 小时更新一次。但是,我确实让 SqlCachDependecy 工作了,所以谢谢,但我可能需要更频繁地更新它。