@segment/redis-clustr
Version:
Redis cluster client
118 lines (83 loc) • 4.49 kB
Markdown
> This fork of redis-clustr updates the `cluster-key-slot`, `denque` and `redis` dependencies and includes a few bug fixes.
```
npm i @segment/redis-clustr
```
Running tests:
```
$ ./test/setup-redis
$ ./test/start-redis
$ npm install
$ npm run test
$ npm run benchmark
$ ./test/stop-redis
```
---
This module is a relatively thin wrapper around the node redis client to enable use of [Redis Cluster](http://redis.io/topics/cluster-spec). It tries to be as unobtrusive as possible - mimicing the behaviour of the [node_redis](https://github.com/mranney/node_redis) client.
```javascript
var RedisClustr = require('@segment/redis-clustr');
var redis = new RedisClustr({
servers: [
{
host: '127.0.0.1',
port: 7000
}
]
});
redis.set('key', 'value');
```
Servers in the cluster will be automatically connected to (via the response of `cluster slots`). Of course, to allow discovery there must be at least one server specified in the configuration.
### Client creation
By default, clients will be created using `Redis.createClient(port, host)`. This can be overridden by providing a function which *must* return a [node_redis](https://github.com/mranney/node_redis) client. Clients are cached so only one connection will be made to each server.
```javascript
var RedisClustr = require('@segment/redis-clustr');
var RedisClient = require('redis');
var redis = new RedisClustr({
servers: [...],
createClient: function(port, host) {
// this is the default behaviour
return RedisClient.createClient(port, host);
}
});
```
```javascript
var RedisClustr = require('@segment/redis-clustr');
var redis = new RedisClustr({
servers: [...],
slotInterval: 1000, // default: none. Interval to repeatedly re-fetch cluster slot configuration
maxQueueLength: 100, // default: no limit. Maximum length of the getSlots queue (basically number of commands that can be queued whilst connecting to the cluster)
queueShift: false, // default: true. Whether to shift the getSlots callback queue when it's at max length (error oldest callback), or to error on the new callback
wait: 5000, // default: no timeout. Max time to wait to connect to cluster before sending an error to all getSlots callbacks
slaves: 'share', // default: 'never'. How to direct readOnly commands: 'never' to use masters only, 'share' to distribute between masters and slaves or 'always' to only use slaves (if available)
createClient: function(port, host, options) {
return require('redis').createClient(port, host, options);
}, // default: redis.createClient. Function used to connect to redis, called with arguments above
redisOptions: {
// options passed to the node_redis client https://github.com/NodeRedis/node_redis#options-is-an-object-with-the-following-possible-properties
retry_max_delay: 500
// etc
}
});
```
Supported - when a response is given with a `MOVED` error, we will immediately re-issue the command on the other server and run another `cluster slots` to get the new slot allocations. `ASK` redirection is also supported - we wil re-issue the command without updating the slots. `TRYAGAIN` responses will be retried automatically.
Multi commands are *supported* but treated as a batch of commands (not an actual multi) and the response is recreated in the original order. Commands are grouped by node and sent as [node_redis batches](https://github.com/NodeRedis/node_redis#clientbatchcommands)
### Multi-key commands (`del`, `mget` and `mset`)
Multi-key commands are also supported and will be split into individual commands (using a batch) then have the response recreated. Only `del`, `mget` and `mset` are supported at the moment.
### Pub/Sub
Pub/Sub is fully supported. When subscribe is used, a new client will be created (connected to a random node). This client is shared for all subscriptions.
```javascript
var RedisClustr = require('@segment/redis-clustr');
var redis = new RedisClustr({...});
redis.on('message', function(channel, message) { /* ... */ });
redis.subscribe('my-channel', function(err) {
redis.publish('my-channel', 'have a lovely day!');
});
```
Just like node_redis, listen to the `error` event to stop your application from crashing due to errors. Redis Clustr automatically intercepts connection errors and will try to reconnect to the server.