当前位置: 首页 > 面试题库 >

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

商勇
2023-03-14
问题内容

我很好奇,建议从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数据库创建一个对象实例。



 类似资料:
  • 我发现其他人也有同样的问题,他们的问题通过在InputStreamReader构造函数中指定UTF-8来解决: 以UTF-8形式读取InputStream 这对我不起作用,我也不知道为什么。无论我尝试什么,我总是得到转义的unicode值(斜杠-U+十六进制),而不是实际的语言字符。我在这里做错了什么?提前道谢! 请注意:这不是字体问题。我之所以知道这一点,是因为如果我对同一个文件使用Resour

  • 问题内容: 目前,我的代码(PHP)中包含太多SQL查询。例如… 我正在研究使用存储过程来减少这种情况并使事情变得更健壮,但是我有一些担忧。 我在网站上使用了数百种不同的查询,其中许多非常相似。将所有这些查询从上下文(使用结果的代码)中删除并放在数据库的存储过程中时,我应该如何管理这些查询? 问题答案: 最佳的操作方法取决于您如何进行数据访问。您可以采用三种方法: 使用存储过程 将查询保留在代码中

  • 问题内容: 我有一个包含单个模块和一些依赖项的项目。我想在一个包含编译模块的单独目录中创建一个jar。另外,我想在模块旁边提供依赖项。 无论我如何扭曲IntelliJ的“构建jar”过程,模块的输出都将显示为空(除了META-INF文件之外)。 问题答案: 这是使用IntelliJ 10构建jar的方法http://blogs.jetbrains.com/idea/2010/08/quickly-

  • 我正在创建一个Lua库来帮助处理发送和接收DNS请求,目前正在阅读这个(DNS协议RFC),但我不知道如何正确格式化请求。例如,我是否必须指定消息的长度?我该怎么做? 我了解,从我的Wireshark检查,我应该也包括选项之后。我还在响应中看到一个;这是否意味着我只需在添加值之前,将请求名称终止为零? 我特别谈论的部分是RFC的4.1.3。 一些注意事项:我使用个人服务器对此进行了测试,并在查询部

  • 情况: > 在按钮上的第一个片段,我想打开带有部分的第二个片段 在第二个片段上,我可以创建新部分(或使用已存在的),然后在列表项上单击打开第三个片段 在第三个片段上,我可以编写新服务(或使用已存在的服务),然后单击按钮返回第一个片段 并显示部分(来自第二个片段)和服务(来自第三个片段) 我的想法是使用片段。在第二个片段上设置参数(bundle),并将其传输到第三个片段 我应该如何正确地将变量从Al

  • 我正在连接到mysql服务器并进行查询。我一直得到一个ER_BAD_FIELD_ERROR:'field list'中的未知列