【问题标题】:Reduce Menu Generation Time减少菜单生成时间
【发布时间】:2013-11-03 04:50:56
【问题描述】:

警告

我想添加一个免责声明来警告这个数据库结构。我强烈建议采用更精简的方法。

我个人的偏好是使用分层的一或二表结构来存储导航菜单。有关从平面结构建立菜单的指导,请参阅https://stackoverflow.com/a/444303/1778606

回答

就我而言,答案是在客户端缓存菜单。如果需要,请继续阅读。


我有一个使用多个查询生成的三层菜单。在我继承的应用程序中,有很多用户组。每个用户都可以通过用户组访问 Web 应用程序的不同页面/部分。单个用户可能在许多用户组中。

在他们的菜单中,每个用户应该只能看到和访问他们的组有权访问的页面。 IE。每个用户只能看到某些菜单项、菜单子菜单部分和菜单子菜单部分项。数据透视表控制可见性和访问。

要生成菜单,我需要进行几个查询。我提出的菜单设计示例如下所示。

根据用户可以访问的第 1 层、第 2 层或第 3 层项目,此菜单看起来完全不同。

是否适合在会话中为每个用户缓存整个菜单,而不是为每个页面加载生成它?这可能会缓存很多数据吗?我主要担心的是它会为会话中的每个活动用户缓存所有三个表(Tier1、Tier2、Tier3)。无论如何我都需要访问数据以查看用户是否有权限,但是,嗯!

是否有任何架构设计可以帮助减少生成菜单所需的查询数量? (假设菜单是在每个页面加载时生成的,就像我开始写这个问题时所假设的那样正常工作)

这种菜单在应用程序中正常吗?我们有大约 20 个组,用户分布在从 2 个到全部 20 个的任何地方?欢迎任何建议或cmets。

(我想尽量减少页面加载和处理时间。)

上下文: 我正在使用 c#、asp.net mvc3、oracle。最大用户群估计约为 20,000。最大活跃用户群接近 1000。可能的活跃用户群为 100。

【问题讨论】:

    标签: asp.net-mvc-3 architecture


    【解决方案1】:

    首先当用户登录时,然后在缓存中加载登录用户下允许的菜单。然后从该用户的缓存中访问菜单/子菜单。当用户注销时清除缓存。在这种情况下,每次新用户登录时,只会为该用户加载缓存。

    谢谢

    【讨论】:

      【解决方案2】:

      您可以添加 app fabric 或 memcached 之类的东西,而不是使用 session 来缓存这些信息。

      这样做的好处是不必在负载平衡的应用程序中处理会话。

      空间应该不是什么大问题。

      【讨论】:

        【解决方案3】:

        为每个用户加载一次整个菜单并将其缓存在客户端上。

        除非它们使缓存无效(通过重新加载),否则不需要重新加载。

        仍然需要在每个页面上进行查询以验证用户是否具有权限。

        (回答我自己的问题的尝试#2)

        【讨论】:

          【解决方案4】:

          这是一个选项...

          将Tier1、Tier2、Tier3数据表保存在应用数据缓存中

          在会话中为每个用户存储Tier1、Tier2、Tier3表的主键,即。一个 Tier1Key、Tier2Key、Tier3Key int[]。

          这应该会在一定程度上减少内存占用。仍然会产生一些负载。您可以通过对子菜单使用局部视图并将局部视图缓存在客户端上来解决此问题。 (这需要通过 ajax 延迟部分菜单加载,这将在 MenuItem 单击时发生)

          您可能需要查询以验证对每个页面的访问权限。

          有关客户端缓存,请参阅OutputCache Location=Client does not appear to work

          (回答我自己的问题)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-07-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多