6

举一个简单的例子:

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连接池吗?

4

3 回答 3

9

回复 incarnate 的连接池帖子:

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

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

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

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

原因#2:这并不是真正的工作方式。Redis 服务器是单线程的。如果您在服务器上等待,则所有客户端都在服务器上等待。如果您在 javascript 中被阻止,则该进程中的所有客户端都在 javascript 中被阻止。

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

于 2013-11-20T05:36:42.477 回答
4

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

于 2013-04-30T08:29:31.653 回答
1

您无需在每个请求上打开和关闭连接。

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

于 2013-04-30T08:34:03.603 回答