你如何*正确*从龙卷风查询Redis?

时间:2011-05-10 17:12:53

标签: twisted redis tornado

我很好奇推荐使用Redis(或任何数据库)查询龙卷风的方法。

我见过像https://gist.github.com/357306这样的例子,但他们似乎都在使用阻止调用redis。

我的理解是,为了避免让Tornado陷入停顿,我需要使用非阻塞的DB库,就像为Twisted开发的那样。

我错了吗?这应该怎么做?

3 个答案:

答案 0 :(得分:40)

当涉及阻止BLPOP等命令或收听发布/订阅频道时,您需要一个像tornado-redis这样的异步客户端。您可以从this demo开始了解tornado-redis客户端如何用于开发简单的公共聊天应用程序。

但我会建议将同步redis-py客户端与hiredis一起用于其他大多数情况。

异步客户端的主要优点是您的服务器可以在等待Redis服务器响应时处理传入请求。但是,Redis服务器速度非常快,在大多数情况下,在Tornado应用程序中设置异步回调的开销会增加请求处理的总时间,然后等待Redis服务器响应所花费的时间。

使用异步客户端可能会尝试同时向Redis服务器发送多个请求,但Redis服务器是单线程服务器(就像Tornado服务器一样),因此它将一对一地回答这些请求一个人,你几乎什么也得不到。事实上,只要有像MGET / MSET这样的管道和命令,您就不必同时向同一台Redis服务器发送多个Redis命令。

当您使用多个Redis服务器实例时,异步客户端有一些优势,但我建议使用同步(redis-py)客户端和twemproxythis one之类的代理(后者支持管道传输和MGET / MSET命令)。

我还建议在Tornado应用程序中使用redis-py客户端时不要使用连接池。只需为应用程序连接的每个Redis数据库创建一个Redis对象实例。

答案 1 :(得分:8)

我建议使用brukva,它是“在Tornado IO循环中工作的异步Redis客户端”。

答案 2 :(得分:1)

一种选择是使用port of Tornado to Twisted,然后使用the Twisted Redis API。 Tornado本身似乎没有任意异步操作作为目标(尽管如果你想重建为Twisted构建的所有类型的东西,你可能可以从{{3>构建它们},但是the low-level iostream APIs in Tornado)。