【问题标题】:SimpleMembership Query PerformanceSimpleMembership 查询性能
【发布时间】:2013-08-11 23:03:33
【问题描述】:

我创建了一个 ASP.NET MVC 4 Internet 应用程序项目。该项目使用 SimpleMembership。要注册一个帐户,它会运行 9 个查询。这似乎是正常的,因为这是项目附带的标准代码,但9个查询不是为了注册一个帐户吗?

我还注意到,当我使用:

if (Roles.IsUserInRole("..."))

它运行 4 个查询...

这是正常的吗?这会成为性能问题吗?

【问题讨论】:

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


    【解决方案1】:

    这很正常。但是当您的网站增长时,这可能是一个性能问题。

    即使在用户的生命周期内,权限也不会发生太大变化。您的绝大多数用户将拥有默认权限集,只有(相对)少数用户将拥有“管理员”或“版主”等角色。当您的站点变大时,查询数据库的权限变得非常昂贵,特别是因为您一遍又一遍地查询相同的数据。每次渲染页面时,您可能都会检查一些权限。用户是否有权查看“删除”按钮?他能看到一些管理菜单吗?如果是论坛或博文,他能看到发帖者的IP地址吗?这种事情需要你在每个页面渲染上多次检查权限,你真的不想通过数据库查询来做。

    正确的解决方案是缓存权限。考虑一下:
    当用户登录时,您会查询他拥有的所有权限并将其缓存在 Web 服务器的内存中。如果您有多个 Web 服务器,则需要同步它们的缓存,或者如果该特定服务器的内存中没有该用户的权限,则让每个单独的服务器查询用户的权限。当用户向该服务器发出请求时,这将按需发生。
    现在您根本不需要查询数据库。所有权限检查都在内存中完成,这将更快地工作并且让您的数据库不受影响。如果您更改用户的权限,您当然需要同步所有 Web 服务器缓存,但由于这种情况很少发生,因此不会对性能产生任何影响。

    您会想在某个时候清除缓存,您的服务器拥有多少 RAM 是有限制的。在此阶段,您可以删除最近一次活动且可能不再浏览您的网站的用户的缓存权限。即使他们仍然存在,他们的权限也会在他们的下一个查询中重新加载。

    【讨论】:

    • 或者,您可以使用ASP Security Kit 之类的东西,让您摆脱这种占用性能但非常有限的授权系统。
    • @VarunK 从未听说过,也找不到任何关于它的博客或文章。我猜这是一些尚未真正经过测试的新库?
    【解决方案2】:

    是的,一切正常。事实上,用户注册并不会影响性能。

    但是Roles.IsUserInRole("...")等类似方法,可以多次调用,所以是性能问题。

    如果您的网站有许多并发用户,也许您应该考虑执行您自己的自定义角色检查查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 2011-05-06
      • 2013-08-04
      • 2011-10-23
      • 2010-09-07
      相关资源
      最近更新 更多