1
0
mirror of https://github.com/redis/node-redis.git synced 2025-08-06 02:15:48 +03:00

Exchange queue with a better one

This commit is contained in:
Ruben Bridgewater
2015-10-04 22:35:17 +02:00
parent e0b9f0de79
commit 2232a8948e
6 changed files with 9 additions and 104 deletions

View File

@@ -7,6 +7,7 @@ Features
- Added disable_resubscribing option to prevent a client from resubscribing after reconnecting (@BridgeAR) - Added disable_resubscribing option to prevent a client from resubscribing after reconnecting (@BridgeAR)
- Added rename_commands options to handle renamed commands from the redis config (@digmxl & @BridgeAR) - Added rename_commands options to handle renamed commands from the redis config (@digmxl & @BridgeAR)
- Increase performance by exchanging built in queue with [Petka Antonov's](@petkaantonov) [double-ended queue](https://github.com/petkaantonov/deque) and prevent polymorphism (@BridgeAR)
Bugfixes Bugfixes

View File

@@ -4,7 +4,7 @@ var net = require('net');
var URL = require('url'); var URL = require('url');
var util = require('util'); var util = require('util');
var utils = require('./lib/utils'); var utils = require('./lib/utils');
var Queue = require('./lib/queue'); var Queue = require('double-ended-queue');
var Command = require('./lib/command'); var Command = require('./lib/command');
var events = require('events'); var events = require('events');
var parsers = []; var parsers = [];
@@ -511,7 +511,7 @@ RedisClient.prototype.connection_gone = function (why) {
this.retry_delay = this.connect_timeout - this.retry_totaltime; this.retry_delay = this.connect_timeout - this.retry_totaltime;
} }
debug("Retry connection in " + this.retry_delay + " ms"); debug('Retry connection in ' + this.retry_delay + ' ms');
this.retry_timer = setTimeout(retry_connection, this.retry_delay, this); this.retry_timer = setTimeout(retry_connection, this.retry_delay, this);
}; };

View File

@@ -1,61 +0,0 @@
'use strict';
// Queue class adapted from Tim Caswell's pattern library
// http://github.com/creationix/pattern/blob/master/lib/pattern/queue.js
function Queue() {
this.tail = [];
this.head = [];
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;
}
}
var item = this.head[this.offset];
this.head[this.offset] = null;
this.offset++;
return item;
};
Queue.prototype.push = function (item) {
return this.tail.push(item);
};
Queue.prototype.forEach = function (fn, thisv) {
var array = this.head.slice(this.offset), i, il;
array.push.apply(array, this.tail);
if (thisv) {
for (i = 0, il = array.length; i < il; i += 1) {
fn.call(thisv, array[i], i, array);
}
} else {
for (i = 0, il = array.length; i < il; i += 1) {
fn(array[i], i, array);
}
}
return array;
};
Queue.prototype.getLength = function () {
return this.head.length - this.offset + this.tail.length;
};
Object.defineProperty(Queue.prototype, 'length', {
get: function () {
return this.getLength();
}
});
module.exports = Queue;

View File

@@ -25,11 +25,12 @@ function replyToStrings(reply) {
} }
if (Array.isArray(reply)) { if (Array.isArray(reply)) {
var res = new Array(reply.length);
for (i = 0; i < reply.length; i++) { for (i = 0; i < reply.length; i++) {
// Recusivly call the function as slowlog returns deep nested replies // Recusivly call the function as slowlog returns deep nested replies
reply[i] = replyToStrings(reply[i]); res[i] = replyToStrings(reply[i]);
} }
return reply; return res;
} }
return reply; return reply;

View File

@@ -17,6 +17,9 @@
"pretest": "optional-dev-dependency hiredis", "pretest": "optional-dev-dependency hiredis",
"posttest": "jshint ." "posttest": "jshint ."
}, },
"dependencies": {
"double-ended-queue": "^2.1.0-0"
},
"devDependencies": { "devDependencies": {
"coveralls": "^2.11.2", "coveralls": "^2.11.2",
"jshint": "^2.8.0", "jshint": "^2.8.0",

View File

@@ -1,39 +0,0 @@
'use strict';
var assert = require("assert");
var Queue = require('../lib/queue');
describe('queue', function () {
var q = new Queue();
describe('push', function () {
it('places values on end of queue', function () {
q.push('a');
q.push(3);
assert.equal(q.length, 2);
});
});
describe('shift', function () {
it('removes values from front of queue', function () {
assert.equal(q.shift(), 'a');
});
});
describe('forEach', function () {
it('iterates over values in queue', function () {
q.forEach(function (v) {
assert.equal(v, 3);
});
});
});
describe('forEachWithScope', function () {
it('provides a scope to the iteration function', function () {
q.forEach(function (v) {
assert.equal(this.foo, 'bar');
assert.equal(v, 3);
}, {foo: 'bar'});
});
});
});