kessler / redis-cluster

[DISCONTINUED] a hashring based redis cluster

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[DISCONTINUED] RedisCluster

The new native redis cluster is out!!! rejoice!

A redis cluster with pluggable redis client factory and key mapper / load balancer.

The execMany function requires that the key mapper will be consistent (i.e it should know in which server a key resides)

install

	npm install node-redis-cluster

default: hash ring based redis cluster

The default cluster uses a hash ring to disribute keys among its nodes

var RedisCluster = require('node-redis-cluster').RedisCluster;

var rcluster = RedisCluster.create([
	{ port: 6379, host: '10.0.0.1' },
	{ port: 6379, host: '10.0.0.2' },
	{ port: 6379, host: '10.0.0.3' },
]);

var redis1 = rcluster.getRedis('someKey');
var redis2 = rcluster.getRedis('someKey');

// redis1 === redis2

rcluster.exec('get', ['somekey'], function(err, reply) {
	//reply is the value of somekey
});

rcluster.execMany('get', ['somekey1', 'somekey2', 'somekey3', 'somekey4'], function(err, results) {
	/* results will be
		{
			somekey1: 'somevalue',
			somekey2: 'somevalue',
			somekey3: 'somevalue',
			somekey4: 'somevalue'
		}
	*/
});

rcluster.execAll('keys', ['*'], function(err, results) {
	/* results will be
		{
			'10.0.0.1:6379': [ // keys],
			'10.0.0.2:6379': [ // keys],
			'10.0.0.3:6379': [ // keys]
		}
	*/
});

customizing cluster behavior


var redis = require('redis');
var RedisCluster = require('node-redis-cluster').RedisCluster;

var servers = [
	{ port: 6379, host: '10.0.0.1' },
	{ port: 6379, host: '10.0.0.2' },
	{ port: 6379, host: '10.0.0.3' },
];

function RedisFactory() {

}

RedisFactory.prototype.createClient(port, host) {
	sendEmailToAdmin(host + ':' + port + ' was added to redis cluster');
	return redis.createClient(port, host /* possibly apply any node-redis options */);
};

function CustomKeyMapper() {
	this.servers = [];
}

CustomKeyMapper.prototype.addServer = function(serverKey) {
	this.server.push(serverKey);
};

CustomKeyMapper.prototype.getNode = function(key) {
	if (this.servers.length < 2)
		throw new Error('not enough servers added');

	if (key === 'a') return this.servers[0];
	else return this.servers[1];
};

var customCluster = new RedisCluster(servers, new RedisFactory(), new CustomKeyMapper());

command line interface

A very simple cli is provided as well, to start it:

var Cli = require('node-redis-cluster').Cli;

Cli.start(function(context) {
	context.rcluster.addServer('your.host');
	context.rcluster.addServer('your.host2', 6379);
});

or simply:

node lib/cluster-cli.js

About

[DISCONTINUED] a hashring based redis cluster

License:MIT License


Languages

Language:JavaScript 100.0%