我使用通用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的数据结构功能。
任何帮助都将不胜感激。
答案 0 :(得分:0)
问题是,每当有人点击您的/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中。
答案 1 :(得分:0)
请尝试这种方式,它应该可以正常工作。
=== controller.js ===
$stmt = $conn->prepare("SELECT ".$field_string." FROM ".$table." ORDER BY ".$sorder." ASC");
=== user.js ===
const user = require('./user')()
user.getUser('12345')
.then(user => {
console.log(user.xxxx)
})
答案 2 :(得分:0)
这与TCP fin超时有关(Linux中默认为60秒)。可能你不是重复使用连接而是每次都开一个新连接,这非常好。但是如果你这么快就这么做,那么你冒着使用所有可用端口的风险。您应该使用此sysctl参数来减少tcp fin超时并启用tcp_reuse连接。
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10 #value is in seconds
<强> tcp_tw_reuse 强> TCP重用允许Linux内核从处于TIME_WAIT状态的连接中回收连接槽,并将其重新分配给新连接。重用套接字可以非常有效地减少服务器负载。
<强> tcp_fin_timeout 强> 确定TCP / IP释放已关闭的连接并重用其资源之前必须经过的时间。在此TIME_WAIT状态期间,重新打开与客户端的连接的成本低于建立新连接
参考:http://www.speedguide.net/articles/linux-broadband-tweaks-121