I am using Redis in Node.js and when deployed on live server it started to crash with below error message:
The no of requests are more per second.
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)
I have written common code to open and close the Redis connections and try to reuse connections. (not sure is it correct way of reusing it).
I am using Redis "^2.7.1" and installed Redis locally on Ubuntu.
I am able to enter Redis console and see the keys stored. But not sure why its giving the above error messages very frequently. I am using pm2 module so it restarts once it crashes.
Below is Redis Code in Node.js
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);
});
}
};