Как (повторно) использовать клиентские соединения redis в nodejs/express?
Приведем простой пример:
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?
3 ответа
Вам нужно только одно подключение к Redis для вашего сервера, и вам нужно только закрыть его, если ваш сервер когда-либо останавливается. Ваш сервер просто работает как один процесс.
Ответ на сообщение пула подключений воплощения:
Привет - первое уточнение, сервер Redis IS однопоточный.
То, что вы видите с точки зрения упорядочивания команд, является артефактом того, как вы используете асинхронность, и не связано ни с библиотекой node_redis, ни с самим Redis.
Пул соединений с node_redis определенно не требуется. Вы, конечно, можете использовать его, но это не рекомендуется. Пул соединений снизит эффективность конвейеризации Redis, и из-за состояния протокола Redis может быть проблематичным с некоторыми командами.
Причина № 1: Я не уверен, что это важно или, возможно, хуже, создавая дополнительных клиентов, которые являются дополнительным бременем GC.
Причина № 2: Это не совсем так. Сервер Redis является однопоточным. Если вы ожидаете на сервере, все клиенты ожидают на сервере. Если вы заблокированы в javascript, все клиенты в этом процессе заблокированы в javascript.
Причина № 3: Библиотека node_redis уже переподключается после сбоев.
Вам не нужно открывать и закрывать соединение при каждом запросе.
В вашем примере, даже если запросы будут обрабатываться асинхронно, обратный вызов всегда будет выполняться в правильном контексте. Но вы должны быть осторожны с неатомарными транзакциями, потому что они могут испортить вашу базу данных. используйте MULTI Command, чтобы знать об этом