代码之家  ›  专栏  ›  技术社区  ›  Blankman

拥有一个包含10K条记录的静态用户列表/序列,这是线程安全的吗?

  •  0
  • Blankman  · 技术社区  · 4 年前

    假设我有一个静态引用,指向一组用户的列表/序列:

    val users = List(User(..), User(...))
    

    在我的控制器中,根据传入的查询字符串过滤器,我将过滤用户集合。

    /users/find?locationId=1&age=30
    

    该操作看起来像:

    def findUsers(...) = Action {
      val filteredUsers = users.filter(.....)
      Ok(filteredUsers)
    }
    

    因此,如果该端点每秒收到10K个请求 users 参考是 val 我只是以只读方式过滤结果,这个端点应该很快,对吗?

    这个问题的第二部分是,由于我不能在一个集合中对10K个用户进行硬编码,那么模仿这种行为的最佳方式是什么?或者在这种情况下,如果我从数据库加载数据,我是否必须将其设置为var?

    var users = userService.getAll()
    

    我需要定期重新加载这些用户,比如每3-4小时。

    0 回复  |  直到 4 年前
        1
  •  3
  •   yǝsʞǝla    4 年前

    因此,如果该端点每秒收到10K个请求 用户参考是一个val,我只是在过滤结果 以只读方式,此端点应该非常快,对吗?

    是的,这里没有线程安全问题。如果你使用刷新此列表的东西,当缓存刷新时,如果两个客户端点击了同一个url,你可能会得到不同的响应。如果这是一个问题,可以修复它。在大多数情况下,这不是问题。

    你可以使用 var 如果你想实现刷新自己。还有其他方法,比如使用一个角色来保持这种状态。然而,我认为最好的选择已经由Play框架提供: ScalaCache

    https://www.playframework.com/documentation/2.8.x/ScalaCache

    它具有缓存刷新和过期功能。

    如果你想进一步加速,如果对你有意义,你可以缓存过滤结果。因此,它可以是所有结果和过滤结果的双缓存,也可以只是过滤结果的缓存。这取决于你的需求。