如何(重新)在 nodejs/express 中使用 redis 客户端连接?

Posted

技术标签:

【中文标题】如何(重新)在 nodejs/express 中使用 redis 客户端连接?【英文标题】:How to (re-)use redis client connections in nodejs/express? 【发布时间】:2013-04-24 02:18:17 【问题描述】:

举个简单的例子:

var express = require("express")
var redis = require('redis')
var app = express()

var client = redis.createClient()

app.get('/', function(req, res) 
    req.connection.setTimeout(2 * 1000)
    client.set("test", 1, function (err, resp) 
        res.send('Hello World')
    )
)

app.listen(80)

Redis 连接不需要为每个请求重新建立,是吗?

需要使用redis连接池吗?

【问题讨论】:

【参考方案1】:

回复incarnate的连接池帖子:

您好——首先澄清一下,Redis 服务器单线程的。

您所看到的命令顺序是您使用异步方式的产物,与 node_redis 库或 Redis 本身无关。

使用 node_redis 进行连接池绝对不需要。您当然可以使用它,但不建议这样做。连接池会降低 Redis 流水线的有效性,并且由于 Redis 协议的状态特性,某些命令可能会出现问题。

原因 #1:我不确定这是否重要,或者可能会因为创建额外的客户端而导致额外的 GC 负担更糟。

原因 #2:实际上并非如此。 Redis 服务器是单线程的。如果您在服务器上等待,则所有客户端都在服务器上等待。如果您在 javascript 中被阻止,则该进程中的所有客户端都在 javascript 中被阻止。

原因 #3:node_redis 库在失败后已经重新连接。

【讨论】:

感谢您的详细解释。我肯定错过的关键点是 Redis IS 实际上是单线程的。再次感谢您!【参考方案2】:

您的服务器只需要一个与 redis 的连接,并且您只需在服务器停止时关闭它。您的服务器只是作为单个进程运行。

【讨论】:

如果您使用 pub\sub 频道,这是错误的。如果您的连接设置了原子操作的监视,这也是错误的。不要这样做。 它是否也适用于每分钟处理 50K 请求的服务器?并且每个请求至少执行 2 个 Redis 操作(GET/SET)。与 Redis 的单一连接就足够了吗? @AyazPasha 将“redis-benchmark”命令与您将使用的操作一起使用,例如:redis-benchmark -t ping,set,get -n 50000【参考方案3】:

您无需在每次请求时打开和关闭连接。

在您的示例中,即使请求是异步处理的,回调也将始终在正确的上下文中执行。 但是你应该小心非原子事务,因为它们会弄乱你的数据库。使用 MULTI 命令来了解这一点

【讨论】:

以上是关于如何(重新)在 nodejs/express 中使用 redis 客户端连接?的主要内容,如果未能解决你的问题,请参考以下文章

nodejs / express:如何使用数据发布到外部表单?

如何使用 nodejs / express 将数据存储在 mongodb 中?

如何在套接字函数之外使用(socket.io)发射函数-nodejs,express

如何在 mongodb 中自动插入记录(nodejs、express、mongoose)

如何捕捉这个错误 NodeJs/Express?

如何使用 Bluebird 承诺 NodeJS Express