从 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)
我正在尝试找出建立 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)