2015-06-14 38 views
0

我想弄清楚建立Redis池然后从喷雾路线内呼叫Redis的最佳方法。我想确保我可以使用连接池进行Redis连接。实例化池并在我的喷雾路径中使用它的最佳方式是什么?有没有更好的方法来建立一个可以使用的“全局”池?我应该创建一个演员,并使用它来进行redis调用吗?我在这里显然有点无知。从喷雾路线内呼叫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) 
    } 
} 

回答

2

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

第二我将实际的交互委托给另一个有RedisClient与你的Redis实例/集群交互的actor。

最后,你可以给complete一个喷雾路线,给它一个Future。这基本上意味着你的整个管道将是异步和非阻塞的。

注意:Redis仍然是单线程的,我不认为AFAIK周围有任何问题。

一般情况下,你应该使用反应驾驶员如果可能的话(例如,SlickReactiveMongo

+0

Soumya感谢所有的信息。我会看看。真的很感谢回应。 – scarpacci