我创建了一个 ASP.NET MVC 4 Internet 应用程序项目。该项目使用 SimpleMembership。要注册一个帐户,它会运行 9 个查询。这似乎很正常,因为这是项目附带的标准代码,但9个查询不是为了注册一个帐户而很多吗?
我还注意到,当我使用:
if (Roles.IsUserInRole("..."))
它运行 4 个查询...
这是正常的吗?这会成为性能问题吗?
我创建了一个 ASP.NET MVC 4 Internet 应用程序项目。该项目使用 SimpleMembership。要注册一个帐户,它会运行 9 个查询。这似乎很正常,因为这是项目附带的标准代码,但9个查询不是为了注册一个帐户而很多吗?
我还注意到,当我使用:
if (Roles.IsUserInRole("..."))
它运行 4 个查询...
这是正常的吗?这会成为性能问题吗?
这是正常的。但是当您的网站增长时,这可能是一个性能问题。
权限不会发生太大变化,即使在用户的生命周期内也不会发生太大变化。您的绝大多数用户将拥有默认权限集,只有(相对)少数用户将拥有“管理员”或“版主”等角色。当您的站点变大时,查询数据库的权限变得非常昂贵,特别是因为您一遍又一遍地查询相同的数据。每次渲染页面时,您可能都会检查一些权限。用户是否有权查看“删除”按钮?他能看到一些管理菜单吗?如果是论坛或博文,他能看到发帖者的IP地址吗?这种事情需要您在每个页面呈现时多次检查权限,并且您真的不想通过数据库查询来做到这一点。
正确的解决方案是缓存权限。考虑一下:
当用户登录时,您查询他拥有的所有权限并将其缓存在 Web 服务器的内存中。如果您有多个 Web 服务器,则需要同步它们的缓存,或者如果该特定服务器的内存中没有该用户的权限,则让每个单独的服务器查询用户的权限。当用户向该服务器发出请求时,这将按需发生。
现在您根本不需要查询数据库。所有权限检查都在内存中完成,这将更快地工作并且让您的数据库不受影响。如果您更改用户的权限,您当然需要同步所有 Web 服务器缓存,但由于这种情况很少发生,因此不会对性能产生任何影响。
你会想在某个时候清除缓存,你的服务器有多少 RAM 是有限制的。在此阶段,您可以删除最近一次活动且可能不再浏览您的网站的用户的缓存权限。即使他们仍然存在,他们的权限也会在他们的下一个查询中重新加载。
是的,一切正常。事实上,用户注册并不会影响性能。
但是,Roles.IsUserInRole("...")
和其他类似的方法,可以多次调用,所以是性能问题。
如果您的网站有许多并发用户,也许您应该考虑执行您自己的自定义角色检查查询。