【发布时间】:2017-11-30 18:04:40
【问题描述】:
我在 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)
我已经编写了通用代码来打开和关闭 Redis 连接并尝试重用连接。 (不确定是否是正确的重用方式)。
我正在使用 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);
});
}
};
【问题讨论】:
标签: javascript node.js redis node-redis