【问题标题】:Should I use Data Cache or Output Cache for a complex navigation menu?对于复杂的导航菜单,我应该使用数据缓存还是输出缓存?
【发布时间】:2013-12-08 15:10:19
【问题描述】:

我正在尝试根据不同的标准缓存导航菜单的各个部分。

例如,新闻和文章需要按持续时间刷新,而登录和个人资料内容应该按用户缓存。

我正在考虑 2 个选项 - 有人能告诉我每个选项的优缺点吗?如果可能的话,建议采取更好的方法!

选项 1。

只需将所有需要的 html 缓存为数据缓存中的字符串。需要时手动检查用户差异。

我(也许是错误的)认为这将是实现最多的工作,但也是缓存不同部分的最有效方式。

选项 2。

为菜单的每个部分设置一个具有不同子操作的 NavigationController。 (我们可以根据需要对每个子操作应用不同的 outputCacheProfile。)

但这需要我们为导航菜单的每个部分调用单独的 RenderAction。由于对 Phil Haack 的一篇博客文章的评论,我对此感到担心:

[Render Action] 与发出另一个请求非常相似,因为我们 需要通过路由来确保我们有合适的路由 数据和上下文来调用操作方法。所以每次调用 RenderAction 会加起来。

全文在这里:http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx

【问题讨论】:

  • 我真的很喜欢第二个选项 - 它是非常好的架构并且易于扩展。不幸的是,如果没有关于您的应用程序负载和性能要求的任何信息,就不可能给出明确的答案。第一个选项似乎需要大量的手动工作并且根本无法扩展(如果您有不同类型的用户),这样做的唯一原因 - 如果渲染菜单需要至少 10% 的时间来检索它(例如,来自数据库)。但同样,如果没有有关性能要求的信息,这只是猜测。
  • 谢谢,是的,同意可扩展性。好点子。

标签: asp.net asp.net-mvc asp.net-mvc-4 caching asp.net-mvc-5


【解决方案1】:

我认为人们普遍回避了这个问题,因为这里没有正确的答案。

事实上,您为实现复杂导航而选择的架构将决定最佳的缓存策略。


我非常喜欢通过带有子操作的部分视图进行导航。

我同意您的观点,即引用文件需要更多工作。我更喜欢将导航选项按键分组并通过子操作的参数引用的数据库条目。

所以你的导航表可能看起来像这样

grpId    Title        Path
1        Home Page    /
1        About Page   /Home/About
1        Reports Page /Reports
2        Home Page    /
2        Admin Page   /Admin
2        Reports Page /Reports

您的子操作将采用 grpId

[OutputCache(Duration = 60000, VaryByParam = "grpId")]
public PartialViewResult NavigationPage(int grpId)

可以提取所有导航组选项并呈现自定义导航菜单。这种形式的输出缓存是按时间定制的(60000 秒和您的参数)


结论:

我怀疑我没有告诉你什么新东西,只是证实了你已经倾向于什么。 MVC 框架非常健壮,并提供工具来很好地处理您想做的事情。使用文件和数据缓存也是一种有效的方法,但它会更让人头疼,需要你自己去实现。

请记住:Haacks 的帖子已超过 4 年(MVC 2 Beta)。从那时起,框架和输出缓存得到了很好的发展。您现在可以缓存部分而不用担心缓存整个页面。 This recent reference to caching with MVC 4 没有直接提及 Phil 之前的担忧,但明显忽略了它们。

【讨论】:

  • 嗨,戴夫,感谢您的回复和示例。我确实喜欢 db 的想法,但不幸的是,现阶段实施为时已晚。我承认这个帖子很旧。对我来说,他的措辞表明每次调用渲染操作都与整页请求没有什么不同。每次调用一个页面时提供相当于 5 个页面的服务对我来说仍然听起来很可怕。
  • 这是一个小模块的一部分,将推广到大量站点(负载变化很大),所以我想让它尽可能地友好,即使它可能涉及更多的工作。对此似乎没有普遍的共识,所以测试是要走的路。
  • @MartinHansenLennox,每个部分都像一个子页面,这是部分正确的。但该框架非常智能。每个部分不使用整个 http 请求周期,因此,大部分开销都丢失了。它们实际上并不比实例化一个额外的控制器、运行动作方法更有压力。
  • 好的,很高兴知道。我得到了相反的印象,但由于我的无知,我很容易被误导。 :)
猜你喜欢
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 2012-08-04
  • 2015-02-23
  • 2017-10-30
  • 2018-03-09
相关资源
最近更新 更多