redis-clustr
Advanced tools
Comparing version 1.3.0 to 1.4.0
@@ -0,491 +1,835 @@ | ||
// Generated using tools/commands.js and config/commandsConfig.js on Sun, 22 Nov 2015 23:03:06 GMT | ||
module.exports = { | ||
"lindex": { | ||
"readOnly": true | ||
lindex: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"zrank": { | ||
"readOnly": true | ||
zrank: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"zinterstore": { | ||
"readOnly": false | ||
zinterstore: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: false | ||
}, | ||
"persist": { | ||
"readOnly": false | ||
persist: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"getrange": { | ||
"readOnly": true | ||
getrange: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"brpoplpush": { | ||
"readOnly": false | ||
brpoplpush: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"zscore": { | ||
"readOnly": true | ||
zscore: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"zrevrangebylex": { | ||
"readOnly": true | ||
zrevrangebylex: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"replconf": { | ||
"readOnly": true | ||
replconf: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"sadd": { | ||
"readOnly": false | ||
sadd: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"pfadd": { | ||
"readOnly": false | ||
pfadd: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"getbit": { | ||
"readOnly": true | ||
getbit: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"zincrby": { | ||
"readOnly": false | ||
zincrby: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"hgetall": { | ||
"readOnly": true | ||
hgetall: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"zremrangebyscore": { | ||
"readOnly": false | ||
zremrangebyscore: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"type": { | ||
"readOnly": true | ||
type: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"cluster": { | ||
"readOnly": true | ||
cluster: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"zrange": { | ||
"readOnly": true | ||
zrange: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"debug": { | ||
"readOnly": false | ||
debug: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: false | ||
}, | ||
"bitcount": { | ||
"readOnly": true | ||
bitcount: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"flushdb": { | ||
"readOnly": false | ||
flushdb: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: false | ||
}, | ||
"sunionstore": { | ||
"readOnly": false | ||
sunionstore: { | ||
multiKey: true, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"smove": { | ||
"readOnly": false | ||
smove: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"rpushx": { | ||
"readOnly": false | ||
rpushx: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"zrangebylex": { | ||
"readOnly": true | ||
zrangebylex: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"multi": { | ||
"readOnly": true | ||
multi: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"sdiff": { | ||
"readOnly": true | ||
sdiff: { | ||
multiKey: true, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"hscan": { | ||
"readOnly": true | ||
hscan: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"zrevrank": { | ||
"readOnly": true | ||
zrevrank: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"punsubscribe": { | ||
"readOnly": true | ||
punsubscribe: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"lset": { | ||
"readOnly": false | ||
lset: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"psetex": { | ||
"readOnly": false | ||
psetex: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"hvals": { | ||
"readOnly": true | ||
hvals: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"zrem": { | ||
"readOnly": false | ||
zrem: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"smembers": { | ||
"readOnly": true | ||
smembers: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"zscan": { | ||
"readOnly": true | ||
zscan: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"dbsize": { | ||
"readOnly": true | ||
dbsize: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"sinterstore": { | ||
"readOnly": false | ||
sinterstore: { | ||
multiKey: true, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"lastsave": { | ||
"readOnly": true | ||
lastsave: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"evalsha": { | ||
"readOnly": false | ||
evalsha: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: false | ||
}, | ||
"scan": { | ||
"readOnly": true | ||
scan: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"unsubscribe": { | ||
"readOnly": true | ||
unsubscribe: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"setex": { | ||
"readOnly": false | ||
setex: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"scard": { | ||
"readOnly": true | ||
scard: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"ping": { | ||
"readOnly": true | ||
ping: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"bitpos": { | ||
"readOnly": true | ||
bitpos: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"role": { | ||
"readOnly": false | ||
role: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: false | ||
}, | ||
"psubscribe": { | ||
"readOnly": true | ||
psubscribe: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"wait": { | ||
"readOnly": true | ||
wait: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"config": { | ||
"readOnly": true | ||
config: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"publish": { | ||
"readOnly": true | ||
publish: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"sdiffstore": { | ||
"readOnly": false | ||
sdiffstore: { | ||
multiKey: true, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"lrange": { | ||
"readOnly": true | ||
lrange: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"hsetnx": { | ||
"readOnly": false | ||
hsetnx: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"asking": { | ||
"readOnly": true | ||
asking: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"decr": { | ||
"readOnly": false | ||
decr: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"client": { | ||
"readOnly": true | ||
client: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"linsert": { | ||
"readOnly": false | ||
linsert: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"spop": { | ||
"readOnly": false | ||
spop: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"subscribe": { | ||
"readOnly": true | ||
subscribe: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"lpushx": { | ||
"readOnly": false | ||
lpushx: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"ltrim": { | ||
"readOnly": false | ||
ltrim: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"migrate": { | ||
"readOnly": false | ||
migrate: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: false | ||
}, | ||
"llen": { | ||
"readOnly": true | ||
llen: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"zlexcount": { | ||
"readOnly": true | ||
zlexcount: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"psync": { | ||
"readOnly": true | ||
psync: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"restore-asking": { | ||
"readOnly": false | ||
'restore-asking': { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"save": { | ||
"readOnly": true | ||
save: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"latency": { | ||
"readOnly": true | ||
latency: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"setnx": { | ||
"readOnly": false | ||
setnx: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"auth": { | ||
"readOnly": true | ||
auth: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"hmget": { | ||
"readOnly": true | ||
hmget: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"sinter": { | ||
"readOnly": true | ||
sinter: { | ||
multiKey: true, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"watch": { | ||
"readOnly": true | ||
watch: { | ||
multiKey: true, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"strlen": { | ||
"readOnly": true | ||
strlen: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"sync": { | ||
"readOnly": true | ||
sync: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"zrangebyscore": { | ||
"readOnly": true | ||
zrangebyscore: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"bitop": { | ||
"readOnly": false | ||
bitop: { | ||
multiKey: true, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"msetnx": { | ||
"readOnly": false | ||
msetnx: { | ||
multiKey: true, | ||
interval: 2, | ||
readOnly: false | ||
}, | ||
"hmset": { | ||
"readOnly": false | ||
hmset: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"pfmerge": { | ||
"readOnly": false | ||
pfmerge: { | ||
multiKey: true, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"readwrite": { | ||
"readOnly": true | ||
readwrite: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"sort": { | ||
"readOnly": false | ||
sort: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"monitor": { | ||
"readOnly": true | ||
monitor: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"randomkey": { | ||
"readOnly": true | ||
randomkey: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"incr": { | ||
"readOnly": false | ||
incr: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"mget": { | ||
"readOnly": true | ||
mget: { | ||
group: function(resp) { | ||
return resp.map(function(r) { | ||
if (!r) return r; | ||
return r[0]; | ||
}); | ||
}, | ||
multiKey: true, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"hincrby": { | ||
"readOnly": false | ||
hincrby: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"srandmember": { | ||
"readOnly": true | ||
srandmember: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"zremrangebyrank": { | ||
"readOnly": false | ||
zremrangebyrank: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"script": { | ||
"readOnly": true | ||
script: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"srem": { | ||
"readOnly": false | ||
srem: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"setrange": { | ||
"readOnly": false | ||
setrange: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"mset": { | ||
"readOnly": false | ||
mset: { | ||
group: function() { | ||
return 'OK'; | ||
}, | ||
multiKey: true, | ||
interval: 2, | ||
readOnly: false | ||
}, | ||
"flushall": { | ||
"readOnly": false | ||
flushall: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: false | ||
}, | ||
"blpop": { | ||
"readOnly": false | ||
blpop: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"renamenx": { | ||
"readOnly": false | ||
renamenx: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"select": { | ||
"readOnly": true | ||
select: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"bgrewriteaof": { | ||
"readOnly": true | ||
bgrewriteaof: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"zcount": { | ||
"readOnly": true | ||
zcount: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"substr": { | ||
"readOnly": true | ||
substr: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"sismember": { | ||
"readOnly": true | ||
sismember: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"incrby": { | ||
"readOnly": false | ||
incrby: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"hget": { | ||
"readOnly": true | ||
hget: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"zrevrangebyscore": { | ||
"readOnly": true | ||
zrevrangebyscore: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"setbit": { | ||
"readOnly": false | ||
setbit: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"time": { | ||
"readOnly": true | ||
time: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"slaveof": { | ||
"readOnly": false | ||
slaveof: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: false | ||
}, | ||
"hset": { | ||
"readOnly": false | ||
hset: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"dump": { | ||
"readOnly": true | ||
dump: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"move": { | ||
"readOnly": false | ||
move: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"sscan": { | ||
"readOnly": true | ||
sscan: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"append": { | ||
"readOnly": false | ||
append: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"discard": { | ||
"readOnly": true | ||
discard: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"lpop": { | ||
"readOnly": false | ||
lpop: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"pexpire": { | ||
"readOnly": false | ||
pexpire: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"pfdebug": { | ||
"readOnly": false | ||
pfdebug: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: false | ||
}, | ||
"readonly": { | ||
"readOnly": true | ||
readonly: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"get": { | ||
"readOnly": true | ||
get: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"zadd": { | ||
"readOnly": false | ||
zadd: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"hkeys": { | ||
"readOnly": true | ||
hkeys: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"restore": { | ||
"readOnly": false | ||
restore: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"exec": { | ||
"readOnly": false | ||
exec: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: false | ||
}, | ||
"eval": { | ||
"readOnly": false | ||
eval: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: false | ||
}, | ||
"set": { | ||
"readOnly": false | ||
set: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"expire": { | ||
"readOnly": false | ||
expire: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"zremrangebylex": { | ||
"readOnly": false | ||
zremrangebylex: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"pubsub": { | ||
"readOnly": true | ||
pubsub: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"zcard": { | ||
"readOnly": true | ||
zcard: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"object": { | ||
"readOnly": true | ||
object: { | ||
multiKey: false, | ||
interval: 2, | ||
readOnly: true | ||
}, | ||
"unwatch": { | ||
"readOnly": true | ||
unwatch: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"keys": { | ||
"readOnly": true | ||
keys: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"hdel": { | ||
"readOnly": false | ||
hdel: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"echo": { | ||
"readOnly": true | ||
echo: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"pfselftest": { | ||
"readOnly": true | ||
pfselftest: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"brpop": { | ||
"readOnly": false | ||
brpop: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"pttl": { | ||
"readOnly": true | ||
pttl: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"hincrbyfloat": { | ||
"readOnly": false | ||
hincrbyfloat: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"hlen": { | ||
"readOnly": true | ||
hlen: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"slowlog": { | ||
"readOnly": true | ||
slowlog: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"hexists": { | ||
"readOnly": true | ||
hexists: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"getset": { | ||
"readOnly": false | ||
getset: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"lpush": { | ||
"readOnly": false | ||
lpush: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"info": { | ||
"readOnly": true | ||
info: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"rpoplpush": { | ||
"readOnly": false | ||
rpoplpush: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"zunionstore": { | ||
"readOnly": false | ||
zunionstore: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: false | ||
}, | ||
"lrem": { | ||
"readOnly": false | ||
lrem: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"rpush": { | ||
"readOnly": false | ||
rpush: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"pexpireat": { | ||
"readOnly": false | ||
pexpireat: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"zrevrange": { | ||
"readOnly": true | ||
zrevrange: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"ttl": { | ||
"readOnly": true | ||
ttl: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"del": { | ||
"readOnly": false | ||
del: { | ||
group: function(resp) { | ||
var total = 0; | ||
for (var i = 0; i < resp.length; i++) { | ||
total += (resp[i] || 0); | ||
} | ||
return total; | ||
}, | ||
multiKey: true, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"rename": { | ||
"readOnly": false | ||
rename: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"bgsave": { | ||
"readOnly": true | ||
bgsave: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"decrby": { | ||
"readOnly": false | ||
decrby: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"sunion": { | ||
"readOnly": true | ||
sunion: { | ||
multiKey: true, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"shutdown": { | ||
"readOnly": true | ||
shutdown: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"incrbyfloat": { | ||
"readOnly": false | ||
incrbyfloat: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"pfcount": { | ||
"readOnly": true | ||
pfcount: { | ||
multiKey: true, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"command": { | ||
"readOnly": true | ||
command: { | ||
multiKey: false, | ||
interval: 0, | ||
readOnly: true | ||
}, | ||
"exists": { | ||
"readOnly": true | ||
exists: { | ||
multiKey: true, | ||
interval: 1, | ||
readOnly: true | ||
}, | ||
"rpop": { | ||
"readOnly": false | ||
rpop: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
}, | ||
"expireat": { | ||
"readOnly": false | ||
expireat: { | ||
multiKey: false, | ||
interval: 1, | ||
readOnly: false | ||
} | ||
}; |
{ | ||
"name": "redis-clustr", | ||
"version": "1.3.0", | ||
"version": "1.4.0", | ||
"description": "Redis cluster client", | ||
"main": "src/redisClustr.js", | ||
"main": "src/RedisClustr.js", | ||
"keywords": [ | ||
@@ -21,3 +21,3 @@ "redis", | ||
"scripts": { | ||
"test": "echo \"Error: no test specified\" && exit 1" | ||
"test": "mocha test/test.js" | ||
}, | ||
@@ -30,3 +30,7 @@ "dependencies": { | ||
"hiredis": "^0.4.0" | ||
}, | ||
"devDependencies": { | ||
"js-beautify": "^1.5.10", | ||
"mocha": "^2.3.4" | ||
} | ||
} |
@@ -15,5 +15,5 @@ # redis-clustr | ||
```javascript | ||
var RedisCluster = require('redis-clustr'); | ||
var RedisClustr = require('redis-clustr'); | ||
var redis = new RedisCluster({ | ||
var redis = new RedisClustr({ | ||
servers: [ | ||
@@ -39,5 +39,5 @@ { | ||
```javascript | ||
var RedisCluster = require('redis-clustr'); | ||
var RedisClustr = require('redis-clustr'); | ||
var RedisClient = require('redis'); | ||
var redis = new RedisCluster({ | ||
var redis = new RedisClustr({ | ||
servers: [...], | ||
@@ -51,3 +51,25 @@ createClient: function(port, host) { | ||
### Options | ||
```javascript | ||
var RedisClustr = require('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 functionality | ||
@@ -67,4 +89,19 @@ | ||
### 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('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!'); | ||
}); | ||
``` | ||
### Errors | ||
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. |
@@ -0,1 +1,2 @@ | ||
'use strict'; | ||
// quickly ported from https://github.com/antirez/redis-rb-cluster/blob/master/crc16.rb | ||
@@ -2,0 +3,0 @@ |
@@ -0,3 +1,3 @@ | ||
'use strict'; | ||
var setupCommands = require('./setupCommands'); | ||
var multiKeyCommands = require('../config/multiKeyCommands'); | ||
@@ -43,3 +43,3 @@ /* | ||
if (!todo) return setImmediate(function() { cb(null); }); | ||
if (!todo) return setImmediate(function() { cb(null, []); }); | ||
@@ -55,26 +55,13 @@ var isDone = function() { | ||
var conf = op[1]; | ||
var keys = Array.prototype.slice.call(op[2]); | ||
var cb = function(err) { | ||
if (err) self.cluster.emit('error', err); | ||
}; | ||
if (typeof keys[keys.length - 1] === 'function') cb = keys.pop(); | ||
var parsed = self.cluster.parseArgs(op[2]); | ||
var args = parsed[0]; | ||
var cb = parsed[1]; | ||
var first = keys[0]; | ||
if (Array.isArray(first)) { | ||
keys = first; | ||
} | ||
// support multi-key commands (only run special code if there's more than one key, otherwise normal command) | ||
var multiConf = multiKeyCommands[cmd]; | ||
if (multiConf && keys.length > multiConf.interval) { | ||
var multiGroups = []; | ||
for (var i = 0; i < keys.length; i += multiConf.interval) { | ||
multiGroups.push(keys.slice(i, i + multiConf.interval)); | ||
} | ||
var multiTodo = multiGroups.length; | ||
if (conf.multiKey && conf.group && args.length > conf.interval) { | ||
var multiTodo = args.length / conf.interval; | ||
var multiErrors = null; | ||
var multiResp = []; | ||
multiGroups.forEach(function(multiKeys, multiIndex) { | ||
var cli = self.cluster.selectClient(multiKeys[0], conf); | ||
var runMultiGroup = function(cli, multiKeys, multiIndex) { | ||
var b = batches[cli.address] || (batches[cli.address] = cli.batch()); | ||
@@ -88,3 +75,3 @@ self.cluster.commandCallback(cli, cmd, multiKeys, function(err, res) { | ||
if (!--multiTodo) { | ||
multiResp = multiConf.group(multiResp); | ||
multiResp = conf.group(multiResp); | ||
cb(multiErrors, multiResp); | ||
@@ -96,11 +83,32 @@ resp[index] = multiResp; | ||
b[cmd].apply(b, multiKeys); | ||
}); | ||
}; | ||
for (var i = 0; i < multiTodo; i++) { | ||
var multiKeys = args.slice(i * conf.interval, (i + 1) * conf.interval); | ||
var cli = self.cluster.selectClient(multiKeys[0], conf); | ||
if (!cli[cmd]) return cb(new Error('NodeRedis doesn\'t know the ' + cmd + ' command')); | ||
runMultiGroup(cli, multiKeys, i); | ||
} | ||
return; | ||
} | ||
var cli = self.cluster.selectClient(keys, conf); | ||
var cli; | ||
if (cmd === 'eval' || cmd === 'evalsha') { | ||
var numKeys = args[1]; | ||
if (!numKeys) { | ||
cli = self.getRandomConnection(); | ||
} else { | ||
// select based on the first KEYS argument | ||
// we *could* validate that all keys are together, but it's easier | ||
// to allow redis to error instead | ||
cli = self.cluster.selectClient(args[2], {}); | ||
} | ||
} else { | ||
cli = self.cluster.selectClient(args, conf); | ||
} | ||
var b = batches[cli.address] || (batches[cli.address] = cli.batch()); | ||
if (!b[cmd]) return cb(new Error('NodeRedis doesn\'t know the ' + cmd + ' command')); | ||
self.cluster.commandCallback(cli, cmd, keys, function(err, res) { | ||
cb.apply(this, arguments); | ||
self.cluster.commandCallback(cli, cmd, args, function(err, res) { | ||
cb(err, res); | ||
if (err) { | ||
@@ -114,3 +122,3 @@ if (!errors) errors = []; | ||
b[cmd].apply(b, keys); | ||
b[cmd].apply(b, args); | ||
}); | ||
@@ -117,0 +125,0 @@ |
@@ -0,17 +1,18 @@ | ||
'use strict'; | ||
var commands = require('../config/commands'); | ||
var multiKeyCommands = require('../config/multiKeyCommands'); | ||
module.exports = function(Class) { | ||
function setupCommand(cmd, conf) { | ||
if (multiKeyCommands[cmd] && Class.prototype.doMultiKeyCommand) { | ||
Class.prototype[cmd] = function() { | ||
this.doMultiKeyCommand(cmd, conf, multiKeyCommands[cmd], arguments); | ||
return this; | ||
}; | ||
} else { | ||
Class.prototype[cmd] = function() { | ||
this.doCommand(cmd, conf, arguments); | ||
return this; | ||
}; | ||
} | ||
var fn = 'doCommand'; | ||
if (conf.multiKey && conf.group && Class.prototype.doMultiKeyCommand) fn = 'doMultiKeyCommand'; | ||
Class.prototype[cmd] = function() { | ||
var args = new Array(arguments.length); | ||
for (var i = 0; i < args.length; i++) { | ||
args[i] = arguments[i]; | ||
} | ||
this[fn](cmd, conf, args); | ||
return this; | ||
}; | ||
} | ||
@@ -18,0 +19,0 @@ |
var redis = require('redis').createClient(); | ||
var fs = require('fs'); | ||
var beautify = require('js-beautify').js_beautify; | ||
var extraConfig = require('../config/commandsConfig'); | ||
var commands = {}; | ||
redis.command(function(err, res) { | ||
redis.quit(); | ||
if (err) return console.error(err); | ||
for (var i = 0; i < res.length; i++) { | ||
var c = res[i]; | ||
commands[c[0]] = { | ||
// multiKey: c[4] === -1, | ||
// interval: c[5], | ||
readOnly: c[2].indexOf('readonly') !== -1 | ||
}; | ||
var cnf = extraConfig[c[0]] || {}; | ||
cnf.multiKey = c[4] === -1; | ||
cnf.interval = c[5]; | ||
cnf.readOnly = c[2].indexOf('readonly') !== -1; | ||
commands[c[0]] = cnf; | ||
} | ||
var file = 'module.exports = ' + JSON.stringify(commands, null, 2) + ';\n'; | ||
var file = '// Generated using tools/commands.js and config/commandsConfig.js on ' + new Date().toUTCString() + '\n\n'; | ||
file += beautify('module.exports = ' + convert(commands), { indent_size: 2 }) + ';\n'; | ||
fs.writeFileSync('./config/commands.js', file); | ||
}); | ||
// horrible function to convert a JS object to a string (so we can write the config file) | ||
function convert(obj) { | ||
var type = typeof obj; | ||
if (type === 'object' && Array.isArray(obj)) { | ||
return '[' + obj.map(convert) + ']'; | ||
} | ||
if (obj && type === 'object') { | ||
var string = []; | ||
for (var i in obj) { | ||
var prop = i; | ||
if (prop.indexOf('-') !== -1) prop = "'" + prop + "'"; | ||
string.push(prop + ':' + convert(obj[i])); | ||
} | ||
return '{' + string + '}'; | ||
} | ||
if (type === 'function') { | ||
return obj.toString(); | ||
} | ||
return JSON.stringify(obj); | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No tests
QualityPackage does not have any tests. This is a strong signal of a poorly maintained or low quality package.
Found 1 instance in 1 package
56712
1960
1
104
2
1