Javascript node.js中的Redis错误
我在Node.js中使用Redis,当部署到live server上时,它开始崩溃,错误消息如下: 每秒的请求数大于Javascript node.js中的Redis错误,javascript,node.js,redis,node-redis,Javascript,Node.js,Redis,Node Redis,我在Node.js中使用Redis,当部署到live server上时,它开始崩溃,错误消息如下: 每秒的请求数大于 at Object.replyToObject [as reply_to_object] (/home/ubuntu/webservices/node_modules/redis/lib/utils.js:7:15) at RedisClient.handle_reply (/home/ubuntu/webservices/node_modules/redis/index.js:
at Object.replyToObject [as reply_to_object] (/home/ubuntu/webservices/node_modules/redis/lib/utils.js:7:15)
at RedisClient.handle_reply (/home/ubuntu/webservices/node_modules/redis/index.js:319:23)
at multi_callback (/home/ubuntu/webservices/node_modules/redis/lib/multi.js:79:43)
at Command.callback (/home/ubuntu/webservices/node_modules/redis/lib/multi.js:116:9)
at normal_reply (/home/ubuntu/webservices/node_modules/redis/index.js:726:21)
at RedisClient.return_reply (/home/ubuntu/webservices/node_modules/redis/index.js:824:9)
at JavascriptRedisParser.returnReply (/home/ubuntu/webservices/node_modules/redis/index.js:192:18)
at JavascriptRedisParser.execute (/home/ubuntu/webservices/node_modules/redis/node_modules/redis-parser/lib/parser.js:553:10)
Socket.<anonymous> (/home/ubuntu/webservices/node_modules/redis/index.js:274:27)
emitOne (events.js:116:13)
Socket.emit (events.js:211:7)
addChunk (_stream_readable.js:263:12)
readableAddChunk (_stream_readable.js:250:11)
at Socket.Readable.push (_stream_readable.js:208:10)
at TCP.onread (net.js:594:20)
client.multi([commands])
没有打开多个连接,只是指出,因为函数openMultiRedisConnection
具有误导性
你用错了,每个参考
client.multi([命令])
多个命令排队,直到发出EXEC,然后是所有命令
命令由Redis以原子方式运行。node_redis中的接口为
通过调用client.Multi()返回单个多对象。如果有的话
命令无法排队,所有命令都被回滚,没有一个命令继续执行
待执行(有关更多信息,请查看交易)
Multi返回一个单独的对象,在调用.exec
后再次使用它不是很好
我不知道为什么您需要多个数据库,但您正在使用选定的\u db
和全局客户端变量更改数据库,这很糟糕!可能会引起很多问题!(数据不一致、冲突等)。
您可以使用client.select(callback)
来更改数据库,但这似乎是个坏主意
这部分代码没有理由,它与不这样做完全相同
.then(function (result) {
return Promise.resolve(result);
});
您应该可以只使用一个数据库
var Promise = require('bluebird');
var Redis = Promise.promisifyAll(require('redis'));
// Global (Avoids Duplicate Connections)
var redisClient = [];
// Make the below functions as private
function openRedisConnection( {
if (redisClient && redisClient.connected)
return redisClient;
if (redisClient)
redisClient.end(); // End and open once more
redisClient = Redis.createClient(6379,process.env.REDIS_URL,{"db":1});
return redisClient;
}
function getExpiryTime(key) {
return 120; // testing
}
module.exports = {
/**
* Get Key-Value Pair
*/
getRedisValue: function (keys) {
return openRedisConnection().mgetAsync(keys);
},
/**
* Set Key-Value Pair
*/
setRedisValue: function (key, value) {
return openRedisConnection()
.setAsync(key, value, 'EX', getExpiryTime(key));
},
getV2MultiRedisValue: function (keyList) {
let redisClient = openRedisConnection();
//no need to open multi here....
let multi = redisClient.multi();
multi.hgetallAsync(keyList);
return multi.execAsync();
},
setV2MultiRedisValue: function (key, redisList) {
let expiryTime = getExpiryTime(key);
let redisClient = openRedisConnection();
let multi = redisClient.multi();
for (let item of redisList) {
multi.hmsetAsync(item.key, item.value);
multi.expireAsync(item.key, expiryTime);
}
return multi.execAsync();
}
};
谢谢你的回答。。1.然后(函数(结果){returnpromise.resolve(结果);});实际上,在承诺得到解决之前,为了清晰起见,有些业务逻辑被删除了,所以这没关系。。2个不同的数据库需要检查我是否可以合并。3多概念让我实施并尽快回复您//无需在此处打开多概念。。。。您在getV2MultiRedisValue函数中提到了这个注释,并说
let multi=redisClient.multi()代码>这是正确的吗?只是弄糊涂了multi
用于执行que和运行多个命令。由于您只执行一个命令hgetallAsync
,因此不需要使用multiRedis,它通常用于缓存数据,而不是复杂的“业务”逻辑。你到底想合并什么。。。也许你有一些可以运行不同的逻辑?谢谢我检查了近5天的服务器监控没有发生崩溃。你的代码成功了。
var Promise = require('bluebird');
var Redis = Promise.promisifyAll(require('redis'));
// Global (Avoids Duplicate Connections)
var redisClient = [];
// Make the below functions as private
function openRedisConnection( {
if (redisClient && redisClient.connected)
return redisClient;
if (redisClient)
redisClient.end(); // End and open once more
redisClient = Redis.createClient(6379,process.env.REDIS_URL,{"db":1});
return redisClient;
}
function getExpiryTime(key) {
return 120; // testing
}
module.exports = {
/**
* Get Key-Value Pair
*/
getRedisValue: function (keys) {
return openRedisConnection().mgetAsync(keys);
},
/**
* Set Key-Value Pair
*/
setRedisValue: function (key, value) {
return openRedisConnection()
.setAsync(key, value, 'EX', getExpiryTime(key));
},
getV2MultiRedisValue: function (keyList) {
let redisClient = openRedisConnection();
//no need to open multi here....
let multi = redisClient.multi();
multi.hgetallAsync(keyList);
return multi.execAsync();
},
setV2MultiRedisValue: function (key, redisList) {
let expiryTime = getExpiryTime(key);
let redisClient = openRedisConnection();
let multi = redisClient.multi();
for (let item of redisList) {
multi.hmsetAsync(item.key, item.value);
multi.expireAsync(item.key, expiryTime);
}
return multi.execAsync();
}
};