node.js中的Redis错误

我在Node.js中使用Redis,并且在实时服务器上部署时,它开始崩溃,出现以下错误消息:

请求的数量是每秒更多。

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) 

我编写了通用代码来打开和closuresRedis连接,并尝试重新使用连接。 (不知道这是重复使用它的正确方法)。

我正在使用Redis“^ 2.7.1”并在Ubuntu上本地安装Redis。

我能够进入Redis控制台并查看存储的密钥。 但不知道为什么它非常频繁地给出上述错误信息。 我正在使用pm2模块,所以一旦崩溃就重新启动。

以下是Node.js中的Redis代码

 var Promise = require('bluebird'); var Redis = Promise.promisifyAll(require('redis')); // Global (Avoids Duplicate Connections) var redisClient = null; var redisMultiClient = null; // 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); redisClient.selected_db = 1; return redisClient; } function openMultiRedisConnection() { if (redisMultiClient && redisMultiClient._client.connected) { redisMultiClient._client.selected_db = 0; return redisMultiClient; } if (redisMultiClient) redisMultiClient.quit(); // End and open once more redisMultiClient = Redis.createClient(6379,process.env.REDIS_URL).multi(); redisMultiClient._client.selected_db = 0; return redisMultiClient; } 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)) .then(function (result) { return Promise.resolve(result); }); }, getV2MultiRedisValue: function (keyList) { let redisMultiClientObj = openMultiRedisConnection(); redisMultiClientObj._client.selected_db = 2; redisMultiClientObj.hgetallAsync(keyList); return redisMultiClientObj.execAsync() .then(function (results) { return Promise.resolve(results); }); }, setV2MultiRedisValue: function (key, redisList) { let expiryTime = getExpiryTime(key); let redisMultiClientObj = openMultiRedisConnection(); redisMultiClientObj._client.selected_db = 2; for (let item of redisList) { redisMultiClientObj.hmsetAsync(item.key, item.value); redisMultiClientObj.expireAsync(item.key, expiryTime); } return redisMultiClientObj.execAsync() .then(function (results) { return Promise.resolve(results); }); } }; 

client.multi([commands])不会打开多个连接,只是指出,因为函数openMultiRedisConnection是误导。

每个参考你使用错误

client.multi([命令])

MULTI命令排队等待EXEC发出,然后所有命令都由Redis自动运行。 node_redis中的接口是通过调用client.multi()来返回一个单独的Multi对象。 如果任何命令不能排队,所有的命令都会被回滚,而且没有任何命令会被执行(更多信息请看事务)。

Multi返回一个单独的Object,在.exec之后再次使用它不太好。

我不知道为什么你需要更多的一个数据库,但你正在改变数据库与selected_db和全局客户端variables,这是坏的! 并可能导致很多问题!(数据不一致,冲突等)。 您可以使用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(); } };