我正在使用通用redis存储来自近60个系统的数据。这个通用redis用于所有机器之间的通信。起初一切似乎都运行良好,但随着我将机器从 60 台增加到 80 台,与 Redis 的连接数量增加,之后它不再接受任何连接,这导致了一个大问题。
当我开始使用 'netstat -na | 调试问题时grep 6379' 我发现,每当我们连接到 redis 时,它都会在特定端口打开一个 TCP/IP 连接,并且没有释放该连接,并且即使在调用 $redis->quit() 之后,该连接仍保持在 TIME_WAIT 状态近 60 秒(使用PHP的predis库)
我尝试解决这个问题的方法:
1) 我试图减少/proc/sys/net/ipv4/tcp_fin_timeout 中的 timewait 秒数,但这不是正确的解决方案。
2)我从 PHP 转移到 nodejs 并尝试在 nodejs 中使用连接池但没有成功。这是示例代码
app.get('/setinredis',function(req,res){
var poolRedis = require('pool-redis')({
'host': 'localhost',
'password': '',
'maxConnections': 5
});
poolRedis.getClient(function(client, done) {
client.get('somekey', function(err, value) {
console.log('value from redis is:', value);
done();
res.send({message:"Done"});
});
});
});
有没有什么方法可以有效地解决这个问题,或者有什么方法可以替代具有数据结构功能的redis。
如有任何帮助,我们将不胜感激。
最佳答案
问题是每次有人访问您的 /setinredis
端点时您都会创建一个池。这意味着如果您点击该端点 1000 次,您将创建 1000 个池。将池创建移到路由之外:
var poolRedis = require('pool-redis')({
'host': 'localhost',
'password': '',
'maxConnections': 5
});
app.get('/setinredis',function(req,res){
poolRedis.getClient(function(client, done) {
client.get('somekey', function(err, value) {
console.log('value from redis is:', value);
done();
res.send({message:"Done"});
});
});
});
编辑:作为旁注,您的问题令人困惑,因为它指的是 PHP,但代码在 Node.js 中。
关于php - Redis 多个连接以 TIME_WAIT 状态打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37813406/