diff --git a/README.md b/README.md index f09ae3ea6a56c810cef331dc43d6aecf54dcb670..ce2bd0d93c1904b9edf14688f25cfbf10d6de2c4 100644 --- a/README.md +++ b/README.md @@ -51,8 +51,22 @@ Once you've got your `env` instance, here are some things you can do with it `env.redis` will provide you with a singleton instance of a redis client or a new instance. It will use Redis Sentinel it it's configured. +Example configuration: +```json +{ + "redisDb": 1, + "sentinel": { + "master-name": "test-master", + "hosts": ["localhost:46379"] + }, + clientOpts: { + "return_buffers": true + } +} +``` + * `env.redis.getClient()` - returns the main singleton Redis client. -* `env.redis.createClient()` - returns a new Redis client. +* `env.redis.createClient([options])` - returns a new Redis client. Uses `redis` config by default. * `env.redis.quitClient()` - closes a Redis client (don't do this with the main singleton client) ## Statistics diff --git a/lib/env.js b/lib/env.js index 84bbfa6073e2c1b35c0f3af0679ab10b0e013e96..e0314af32fdcec292031ceb20bffb58263bed004 100644 --- a/lib/env.js +++ b/lib/env.js @@ -60,13 +60,16 @@ exports.create = function(configDirectory) { getClient: function() { if(mainRedisClient) return mainRedisClient; - mainRedisClient = redisClient.create({ config: config, logger: logger }); + // no options override for singleton + var options = config.get('redis'); + mainRedisClient = redisClient.create(options, logger); return mainRedisClient; }, - createClient: function() { - return redisClient.create({ config: config, logger: logger }); + createClient: function(options) { + options = options || config.get('redis'); + return redisClient.create(options, logger); }, /** @@ -74,7 +77,10 @@ exports.create = function(configDirectory) { */ createTransientClient: function(callback) { var mainClient = this.getClient(); - return redisClient.createTransientClient(mainClient, { config: config, logger: logger }, callback); + + // no options override for singleton + var options = config.get('redis'); + return redisClient.createTransientClient(mainClient, options, logger, callback); }, quitClient: function(client) { diff --git a/lib/redis-client.js b/lib/redis-client.js index d572937d27da5fa47c34f2b7023fdc8c67889857..3764579cdaa1bc6f8179aa41ed03059637fdd1a8 100644 --- a/lib/redis-client.js +++ b/lib/redis-client.js @@ -9,9 +9,7 @@ var async = require('async'); /** * Switches redis database */ -function switchDatabase(client, nconf, logger) { - var redisDb = nconf.get("redis:redisDb"); - +function switchDatabase(client, redisDb, logger) { if(redisDb) { client.select(redisDb, function(err) { if(err) { @@ -26,8 +24,8 @@ function switchDatabase(client, nconf, logger) { /** * Creates a sentinel client */ -function createSentinelClientInstance(nconf, logger) { - var sentinels = nconf.get("redis:sentinel:hosts").map(function(f) { +function createSentinelClientInstance(sentinelOpts, logger) { + var sentinels = sentinelOpts.hosts.map(function(f) { var a = f.split(':'); return [a[0], parseInt(a[1], 10)]; }); @@ -36,7 +34,7 @@ function createSentinelClientInstance(nconf, logger) { var sentinelClient = RedisSentinel.createClient({ sentinels: sentinels, - masterName: nconf.get("redis:sentinel:master-name") + masterName: sentinelOpts["master-name"] }); ['sentinel connect', 'sentinel connected', 'sentinel disconnected', @@ -49,17 +47,17 @@ function createSentinelClientInstance(nconf, logger) { return sentinelClient; } -function createInstance(nconf, logger) { +function createInstance(options, logger) { var client; - if(nconf.get('redis:sentinel')) { - client = createSentinelClientInstance(nconf, logger); + if(options.sentinel) { + client = createSentinelClientInstance(options.sentinel, logger); } else { - var host = nconf.get("redis:host"); - var port = nconf.get("redis:port"); + var host = options.host; + var port = options.port; - client = redis.createClient(port, host); + client = redis.createClient(port, host, options.clientOpts); } - switchDatabase(client, nconf, logger); + switchDatabase(client, options.redisDb, logger); return client; } @@ -68,13 +66,10 @@ function registerClient(client) { clients.push(client); } -function setupTransientClient(port, host, options) { - var nconf = options.config; - var logger = options.logger; - - var client = redis.createClient(port, host); +function setupTransientClient(port, host, redisDb, clientOpts, logger) { + var client = redis.createClient(port, host, clientOpts); - switchDatabase(client, nconf, logger); + switchDatabase(client, redisDb, logger); /* * Add some logging if the transient client is not closed @@ -91,17 +86,19 @@ function setupTransientClient(port, host, options) { return client; } -exports.createTransientClient = function(mainClient, options, callback) { - var nconf = options.config; +exports.createTransientClient = function(mainClient, options, logger, callback) { var host, port; - if(nconf.get('redis:sentinel')) { + var redisDb = options.redisDb; + var clientOpts = options.clientOpts; + + if(options.sentinel) { var master = mainClient.activeMasterClient; /* No master yet? Wait... */ if(!master) { mainClient.on('reconnected', function() { - var client = setupTransientClient(mainClient.activeMasterClient.port, mainClient.activeMasterClient.host, options); + var client = setupTransientClient(mainClient.activeMasterClient.port, mainClient.activeMasterClient.host, redisDb, clientOpts, logger); callback(null, client); }); @@ -111,11 +108,11 @@ exports.createTransientClient = function(mainClient, options, callback) { host = master.host; port = master.port; } else { - host = nconf.get("redis:host"); - port = nconf.get("redis:port"); + host = options.host; + port = options.port; } - var client = setupTransientClient(port, host, options); + var client = setupTransientClient(port, host, redisDb, clientOpts, logger); /* Callback in a second */ setImmediate(function() { @@ -141,11 +138,8 @@ shutdown.addHandler('redis', 1, function(callback) { }); -exports.create = function(options) { - var nconf = options.config; - var logger = options.logger; - - var client = createInstance(nconf, logger); +exports.create = function(options, logger) { + var client = createInstance(options, logger); registerClient(client); return client; @@ -169,4 +163,4 @@ exports.testOnly = { getClients: function() { return clients; } -} +}; diff --git a/tests/redis-test.js b/tests/redis-test.js index 9bb88864093b276d609aa74ffe9473d11472e0db..9592c123dddc0af16d6c13519a7a7128db1e04d4 100644 --- a/tests/redis-test.js +++ b/tests/redis-test.js @@ -33,20 +33,18 @@ function startSentinel() { } describe('gitter-redis', function() { - var redis1, redis2, sentinel, config, logger; + var redis1, redis2, sentinel, options, logger; before(function(done) { - config = mockConfig({ - redis: { - redisDb: 1, - sentinel: { - "master-name": "test-master", - hosts: ["localhost:46379"] - } + options = { + redisDb: 1, + sentinel: { + "master-name": "test-master", + hosts: ["localhost:46379"] } - }); + }; - logger = require('../lib/logger').create({ config: config }); + logger = require('../lib/logger').create({ config: mockConfig({}) }); redis1 = startRedisPrimary(); redis2 = startRedisSecondary(); @@ -63,7 +61,7 @@ describe('gitter-redis', function() { it('should obtain a connection and release it', function(done) { - var mainRedisClient = redisClient.create({ config: config, logger: logger }); + var mainRedisClient = redisClient.create(options, logger); assert.strictEqual(redisClient.testOnly.getClients().length, 1); assert(mainRedisClient); @@ -81,9 +79,9 @@ describe('gitter-redis', function() { }); it('should obtain a transient connection and release it', function(done) { - var mainRedisClient = redisClient.create({ config: config, logger: logger }); + var mainRedisClient = redisClient.create(options, logger); - redisClient.createTransientClient(mainRedisClient, { config: config, logger: logger }, function(err, temporaryClient) { + redisClient.createTransientClient(mainRedisClient, options, logger, function(err, temporaryClient) { assert.strictEqual(redisClient.testOnly.getClients().length, 2); assert(temporaryClient); @@ -107,7 +105,7 @@ describe('gitter-redis', function() { it('should obtain a handle failover correctly', function(done) { this.timeout(15000); - var mainRedisClient = redisClient.create({ config: config, logger: logger }); + var mainRedisClient = redisClient.create(options, logger); mainRedisClient.on('reconnected', function() { mainRedisClient.set('moo', 'cow', function(err) { if(err) return done(err);