假设我有一个对一个用户集合的list/seq的静态引用:
val users = List(User(..), User(...))在我的控制器中,根据传入的querystring过滤器,我将过滤users集合。
/users/find?locationId=1&age=30该操作将类似于:
def findUsers(...) = Action {
val filteredUsers = users.filter(.....)
Ok(filteredUsers)
}因此,如果这个端点每秒收到10K个请求,users引用是一个val,而我只是以只读的方式过滤结果,那么这个端点应该是非常快的正确的吗?
这个问题的第二部分是,既然我不能硬编码一个集合中的10K用户,那么模仿这种行为的最佳方法是什么,或者如果我从db加载数据,在这种情况下,我是否被迫将其设置为var?
var users = userService.getAll()我需要定期重新加载这个用户,可能每隔3-4个小时。
发布于 2021-05-09 14:55:32
所以,如果这个端点每秒收到10K个请求,用户引用是一个val,而我只是以只读的方式过滤结果,那么这个端点应该是非常快的,对吗?
是的,这里没有线程安全方面的问题。如果你使用一些东西来刷新这个列表,当两个客户端在刷新缓存时命中相同的url时,你可能会得到不同的响应。如果这是一个问题,可以对其进行补救。在大多数情况下,这不是问题。
如果您想自己实现刷新,可以使用var。还有其他方法,如使用将保持此状态的参与者。然而,我认为Play框架已经提供了最好的选择:ScalaCache
https://www.playframework.com/documentation/2.8.x/ScalaCache
它有缓存刷新和过期。
如果你想进一步加速,你可以缓存过滤的结果,如果它对你有意义的话。因此,它可以是所有结果和过滤结果的双缓存,也可以只是过滤结果的缓存。这取决于你的需要。
https://stackoverflow.com/questions/67454063
复制相似问题