You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-06 02:15:48 +03:00
Use Queue class to improve shift() performance on large queues.
This commit is contained in:
42
index.js
42
index.js
@@ -199,6 +199,40 @@ RedisReplyParser.prototype.add_multi_bulk_reply = function (reply) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Queue class adapted from Tim Caswell's pattern library
|
||||||
|
// http://github.com/creationix/pattern/blob/master/lib/pattern/queue.js
|
||||||
|
var Queue = function () {
|
||||||
|
this.tail = [];
|
||||||
|
this.head = Array.prototype.slice.call(arguments);
|
||||||
|
this.offset = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
Queue.prototype.shift = function () {
|
||||||
|
if (this.offset === this.head.length) {
|
||||||
|
var tmp = this.head;
|
||||||
|
tmp.length = 0;
|
||||||
|
this.head = this.tail;
|
||||||
|
this.tail = tmp;
|
||||||
|
this.offset = 0;
|
||||||
|
if (this.head.length === 0) return;
|
||||||
|
}
|
||||||
|
return this.head[this.offset++];
|
||||||
|
}
|
||||||
|
|
||||||
|
Queue.prototype.push = function (item) {
|
||||||
|
return this.tail.push(item);
|
||||||
|
};
|
||||||
|
|
||||||
|
Queue.prototype.length = function () {
|
||||||
|
return this.head.length - this.offset + this.tail.length;
|
||||||
|
};
|
||||||
|
|
||||||
|
Object.defineProperty(Queue.prototype, 'length', {
|
||||||
|
get: function () {
|
||||||
|
return this.array.length;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
function RedisClient(stream) {
|
function RedisClient(stream) {
|
||||||
events.EventEmitter.call(this);
|
events.EventEmitter.call(this);
|
||||||
|
|
||||||
@@ -206,7 +240,7 @@ function RedisClient(stream) {
|
|||||||
this.connected = false;
|
this.connected = false;
|
||||||
this.connections = 0;
|
this.connections = 0;
|
||||||
this.attempts = 1;
|
this.attempts = 1;
|
||||||
this.command_queue = [];
|
this.command_queue = new Queue;
|
||||||
this.commands_sent = 0;
|
this.commands_sent = 0;
|
||||||
this.retry_delay = 250;
|
this.retry_delay = 250;
|
||||||
this.retry_backoff = 1.7;
|
this.retry_backoff = 1.7;
|
||||||
@@ -216,7 +250,7 @@ function RedisClient(stream) {
|
|||||||
this.stream.on("connect", function () {
|
this.stream.on("connect", function () {
|
||||||
self.connected = true;
|
self.connected = true;
|
||||||
self.connections += 1;
|
self.connections += 1;
|
||||||
self.command_queue = [];
|
self.command_queue = new Queue();
|
||||||
|
|
||||||
self.reply_parser = new RedisReplyParser();
|
self.reply_parser = new RedisReplyParser();
|
||||||
self.reply_parser.on("reply error", function (reply) {
|
self.reply_parser.on("reply error", function (reply) {
|
||||||
@@ -433,7 +467,9 @@ exports.commands = [
|
|||||||
// Persistence control commands
|
// Persistence control commands
|
||||||
"SAVE", "BGSAVE", "LASTSAVE", "SHUTDOWN", "BGREWRITEAOF",
|
"SAVE", "BGSAVE", "LASTSAVE", "SHUTDOWN", "BGREWRITEAOF",
|
||||||
// Remote server control commands
|
// Remote server control commands
|
||||||
"INFO", "MONITOR", "SLAVEOF", "CONFIG"
|
"INFO", "MONITOR", "SLAVEOF", "CONFIG",
|
||||||
|
// Undocumented commands
|
||||||
|
"PING"
|
||||||
];
|
];
|
||||||
|
|
||||||
exports.commands.forEach(function (command) {
|
exports.commands.forEach(function (command) {
|
||||||
|
Reference in New Issue
Block a user