如何(重新)在 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