php - Redis 多个连接以 TIME_WAIT 状态打开

标签 php node.js redis tcp netstat

我正在使用通用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/

相关文章:

node.js - 如何将文件上传到Cloudinary中的某个文件夹? Node JS

Node.js 服务器 : connect to redis database once? 还是在每次请求时?

node.js - Redis 在生产环境中与 Node.js 结合使用

PHP:按键对 JSON 数据进行排序

java - 构建快速的网络服务

php - JSON 架构验证 : validate array of objects

php - 如何为 doctrine2 中的所有模型调用初始化方法?

javascript - 在终端运行js文件

javascript - 你如何为 firefox 安装和运行 puppeteer

redis - 使用 Redis 的可扩展延迟任务执行