从 Spray Route 中调用 Redis(或其他数据库)

Call Redis (or other db) from within Spray Route

我正在尝试找出建立 Redis 池然后从 Spray 路由中调用 Redis 的最佳方法。我想确保我可以将连接池用于 Redis 连接。实例化池并在我的喷雾路线中使用它的最佳方法是什么?有没有更好的方法建立一个可以使用的"global" pool?我应该创建一个演员并使用它来进行 redis 调用吗?我在这里显然有点无知。

原始 Redis 客户端:

object RedisClient {

  val pool = new JedisPool(new JedisPoolConfig(), "localhost")

  def getValue(key: String): String= {

    try{
      val jedis = pool.getResource()

      //returns redis value
      jedis.get(key)
    }
  }


}

最终调用使用 Redis 客户端的函数的路由

trait DemoService extends HttpService {

  val messageApiRouting =
        path("summary" / Segment / Segment) { (dataset, timeslice) =>
          onComplete(getSummary(dataset, timeslice)) {
            case Success(value) => complete(s"The result was $value")
            case Failure(ex) => complete(s"An error occurred: ${ex.getMessage}")
          }
        }

  def getSummary(dataset: String, timeslice: String): Future[String] = Future {
    val key = dataset + timeslice
    RedisClient.getValue(key)
  }
}

据我所知,Jedis 客户端不是非阻塞和异步的。因此,如果您使用阻塞客户端,您可能无法获得使用 Spray 的所有好处。我建议查看 Rediscala

其次,我会将实际交互委托给另一个具有与您的 Redis 交互的 RedisClient 的参与者 instance/cluster。

最后,您可以 complete 一条喷雾路线,方法是给它一个 Future。这实质上意味着您的整个管道将是异步和非阻塞的。

注意:Redis 仍然是单线程的,我认为 AFAIK 周围没有任何东西。

一般来说,如果可能,您应该使用 响应式驱动程序(例如,Slick, ReactiveMongo