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