我有点思考问题,我不确定我已经构建的内容是否可以更有效地完成,这就是为什么我要分享我的'问题'这里。 (很明显,我所建造的一切都是有效的,我只是希望提高效率)。
我有一个用MVC制作的webapp& SQL为用户提供登录系统等。 用户具有状态,即枚举,可以是活动的,阻止的等,并存储在数据库中(以及其他用户数据)。
在我的webapp中,我制作了一个自定义的AuthorizeAttr。用于在每次调用时授权用户(应用为全局过滤器)。
然而,正常'身份验证基于cookie,当我更改数据库中的用户状态时,cookie不会更改。例如,用户可以取消激活同一组中的另一个用户(当管理员时)。这些数据库更改不会立即生效,因为默认情况下,授权仅验证cookie,并且cookie基于登录时的状态。
为了解决这个问题,我在authorizationAttr中添加了一些额外的逻辑,在每次请求时都会调用数据库获取当前用户状态(枚举),然后只是检查一下是否允许用户继续,或者需要重定向。
在每个请求上调用数据库似乎(即使只是1个枚举)似乎对服务器/数据库有点麻烦,特别是当webapp越来越受欢迎时(=很多用户)。
我想到的一个想法是将枚举缓存在会话缓存中,但是在短时间内(如60秒),这会节省一些数据库调用,但显然用户仍然可以使用webapp最多60秒后de -活性。
我认为这些数据库调用实际上当然是一种征税是错误的。
有任何改进的想法吗?
答案 0 :(得分:0)
您是否考虑过根据您的要求使用ADO.NET DataSet?如果您没有多个前端,则可能最初会将登录状态读入数据集。可以对此进行所有读/写操作,稍后您可以将更改保存到实际数据库中。如果您有多个前端,是否可以将一个组的所有读/写/修改操作限制为单个前端实例?因为我猜你也可以在这种情况下使用数据集方法。
答案 1 :(得分:0)
你怎么知道每个请求的检查状态太贵了?您是否测量了在数据库中检查用户状态的性能成本?您是否创建了自定义缓存而无需实际测量简单解决方案的成本?你喜欢使用像hibernate这样的ORM吗?它们内置了二级缓存,因此通常不会向数据库进行往返。
我认为坚持KISS原则而不是为difficult problem创建自定义解决方案更好。即使您的数据库将成为瓶颈,通常购买额外的硬件一次比维护过于复杂的解决方案多年便宜
如果您的应用程序增长,首先要扔掉的是关系数据库