一尘不染

您如何*正确地*从tornado中查询Redis?

redis

我很好奇,建议从Tornado中查询Redis(或与此相关的任何数据库)的推荐方法是什么。

我已经看到了一些示例,例如https://gist.github.com/357306,但它们似乎都在使用阻塞对Redis的调用。

我的理解是,为了避免停顿Tornado,我需要使用非阻塞数据库库,例如为Twisted开发的库。

我错了吗?应该怎么做?


阅读 338

收藏
2020-06-20

共1个答案

一尘不染

当涉及到诸如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数据库创建一个对象实例。

2020-06-20