对于我服务中的每个功能,我都有一个安全查找,以确保用户有权访问该功能。
查询函数的调用方式如下:
SecurityCheck("Insert", "Book", Session.UserID);
查找表看起来像这样:
| Select All | Select Own | Insert | Update | Delete |
Book | true | true | false | false | false |
Author | true | true | true | true | true |
...
查找表最终将成为30-40行。
我已经读过复杂的对象不应该存储在会话中。这个对象通常被认为太大而无法存储在我的会话中吗?
每个函数的额外数据库调用会显着减慢我的应用程序吗?存放此表的适当位置在哪里?
答案 0 :(得分:2)
对于1000个用户,每个用户1k的内存中的30-40行不是那么大,大约500-1000(如果你添加更多的东西)字节。
但是作为缓存的一般规则,你必须平衡内存的使用与速度。在这种情况下,它取决于这些服务的调用频率以及它们的响应时间。 例如,如果您的函数需要1秒,并且它被调用1次/秒,那么您可以使用数据库版本。如果您正确/清洁功能,它不应该影响性能。
如果你的函数需要0.10秒,并且被调用100次/秒,那么我建议使用内存缓存。
注意:上述规则仅适用于内存会话。
- 如果你有一个SQL会话 - 不要把它们放在会话中 - 通过正常的SQL加载它我认为它应该比从DB&反序列化。
- 如果你有一个会话状态服务器,它将取决于服务器的执行方式,但即使在这种情况下你也可能想从SQL中获取它们,因为仍然会发生序列化
对于这两种情况,另一种选择是将用户权限放在应用程序缓存中。