Javascript node.js中的Redis错误

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:

我在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: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();

    }
};