我很好奇是什么建议的查询Redis(或任何数据库)的方法来自Tornado.
我见过一些像https://gist.github.com/357306这样的例子,但他们似乎都在使用阻塞调用redis.
我的理解是,为了避免让Tornado陷入停顿,我需要使用非阻塞的DB库,就像为Twisted开发的那样.
我错了吗?应该怎么做?
当涉及阻止BLPOP等命令或监听Pub/Sub通道时,您需要一个像tornado-redis这样的异步客户端.您可以从这个演示开始,了解龙卷风redis客户端如何用于开发简单的公共聊天应用程序.
但我建议在大多数其他情况下将同步redis-py客户端与hiredis结合使用.
异步客户端的主要优点是您的服务器可以在等待Redis服务器响应时处理传入请求.但是,Redis服务器速度非常快,在大多数情况下,在Tornado应用程序中设置异步回调的开销会增加请求处理的总时间,然后等待Redis服务器响应所花费的时间.
使用异步客户端可能会尝试同时向Redis服务器发送多个请求,但Redis服务器是单线程服务器(就像Tornado服务器一样),因此它将逐个回答这些请求,你几乎什么都得不到.事实上,只要有像MGET/MSET这样的管道和命令,您就不必同时向同一台Redis服务器发送多个Redis命令.
异步客户端,当您使用Redis的几个服务器实例的一些优势,但我建议使用同步(Redis的-PY)客户端,并像一个代理twemproxy或这一个(后者支持流水线和MGET/MSET命令).
另外,我建议在Tornado应用程序中使用redis-py客户端时不要使用连接池.只需Redis
为应用程序连接的每个Redis数据库创建一个对象实例.
我建议使用brukva,它是"在Tornado IO循环中工作的异步Redis客户端".