我很好奇,建议从Tornado中查询Redis(或与此相关的任何数据库)的推荐方法是什么。
我已经看到了一些示例,例如https://gist.github.com/357306,但它们似乎都在使用阻塞对Redis的调用。
我的理解是,为了避免停顿Tornado,我需要使用非阻塞数据库库,例如为Twisted开发的库。
我错了吗?应该怎么做?
当涉及到诸如BLPOP之类的命令或侦听Pub / Sub频道时,您将需要一个像 tornado- redis之类的异步客户端。您可以从此演示开始,看看如何使用tornado- 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数据库创建一个对象实例。
Redis