redis_cluster 0.2.8 → 0.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +21 -0
- data/lib/redis_cluster/client.rb +3 -3
- data/lib/redis_cluster/configuration.rb +12 -7
- data/lib/redis_cluster/errors.rb +3 -1
- data/lib/redis_cluster/pool.rb +12 -4
- data/lib/redis_cluster/slot.rb +6 -1
- data/lib/redis_cluster/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5f4f4dd87bea457c22bcb596945c12e2cffad6b
|
4
|
+
data.tar.gz: 9cce133f24ba35be564f9a241513a8ae28a49254
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d88d716725acf7b52ca0c99690b86d4203a3a725f5589a4af3f5020317b73139626105a5858336c559131c566d109a542b6a2f4dd1cfae05936deac3bb57ee4
|
7
|
+
data.tar.gz: 55428c277ba8d8a7accc20a4d5cdf572b7df74df550b73409570fe60fd5131f90cf1551133968f8cd4c387bcedc738f82330b13ed077f8582579198d6f1a9015
|
data/README.md
CHANGED
@@ -35,6 +35,11 @@ rs.set "test", 1
|
|
35
35
|
rs.get "test"
|
36
36
|
```
|
37
37
|
|
38
|
+
If masterauth & requirepass configed, you can initialize below:
|
39
|
+
```ruby
|
40
|
+
RedisCluster.new hosts, password: 'password'
|
41
|
+
```
|
42
|
+
|
38
43
|
now support keys command with scanning all nodes:
|
39
44
|
```ruby
|
40
45
|
rs.keys 'test*'
|
@@ -51,6 +56,22 @@ rs.pipelined do
|
|
51
56
|
end
|
52
57
|
```
|
53
58
|
|
59
|
+
script, eval, evalsha
|
60
|
+
```ruby
|
61
|
+
# script commands will run on all nodes
|
62
|
+
rs.script :load, "return redis.call('get', KEYS[1])"
|
63
|
+
rs.script :exists, '4e6d8fc8bb01276962cce5371fa795a7763657ae'
|
64
|
+
rs.script :flush
|
65
|
+
|
66
|
+
# eval/evalsha must executed at one node with hash tag keys in same slot
|
67
|
+
# and must use KEYS to fetch keys in lua script
|
68
|
+
rs.eval "return redis.call('get', KEYS[1]) + ARGV[1]", [:test], [3]
|
69
|
+
rs.evalsha '727fc2fb7c0f11ec134d998654e3dadaacf31a97', [:test], [5]
|
70
|
+
|
71
|
+
# if lua script don't depend on any keys and argvs, you also need execute with a key
|
72
|
+
rs.eval "return 'hello redis!'", [:foo]
|
73
|
+
```
|
74
|
+
|
54
75
|
## Benchmark test
|
55
76
|
|
56
77
|
A simple benchmark at my macbook, start 4 master nodes (and 4 cold slave nodes), running with one ruby process.
|
data/lib/redis_cluster/client.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'thread'
|
2
2
|
|
3
3
|
module RedisCluster
|
4
4
|
|
@@ -27,8 +27,8 @@ module RedisCluster
|
|
27
27
|
err_code = e.to_s.split.first
|
28
28
|
raise e unless %w(MOVED ASK).include?(err_code)
|
29
29
|
|
30
|
-
if err_code ==
|
31
|
-
|
30
|
+
if err_code == 'ASK'
|
31
|
+
asking = true
|
32
32
|
else
|
33
33
|
reload_pool_nodes
|
34
34
|
sleep 0.1 if ttl < Configuration::REQUEST_TTL/2
|
@@ -5,14 +5,19 @@ module RedisCluster
|
|
5
5
|
REQUEST_TTL = 16
|
6
6
|
DEFAULT_TIMEOUT = 1
|
7
7
|
|
8
|
-
SUPPORT_SINGLE_NODE_METHODS = %w(
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
SUPPORT_SINGLE_NODE_METHODS = %w(
|
9
|
+
persist expire expireat ttl pexpire pexpireat pttl dump restore del exists
|
10
|
+
move type decr decrby incr incrby incrbyfloat set setex psetex setnx get
|
11
|
+
setrange getrange setbit getbit append bitcount bitpos getset strlen []
|
12
|
+
[]= llen lpush lpushx rpush rpushx lpop rpop blpop brpop lindex linsert
|
13
|
+
lrange lrem lset ltrim scard sadd srem spop srandmember sismember smembers
|
14
|
+
zcard zadd zincrby zrem zscore zrange zrevrange zrank zrevrank
|
15
|
+
zremrangebyrank zrangebyscore zrevrangebyscore zremrangebyscore zcount
|
16
|
+
hlen hset hsetnx hmset mapped_hmset hget hmget mapped_hmget hdel hexists
|
17
|
+
hincrby hincrbyfloat hkeys hvals hgetall publish pfadd
|
18
|
+
).freeze
|
14
19
|
|
15
|
-
SUPPORT_MULTI_NODE_METHODS = %w(keys multi pipelined)
|
20
|
+
SUPPORT_MULTI_NODE_METHODS = %w(keys script multi pipelined).freeze
|
16
21
|
end
|
17
22
|
|
18
23
|
end
|
data/lib/redis_cluster/errors.rb
CHANGED
data/lib/redis_cluster/pool.rb
CHANGED
@@ -11,14 +11,14 @@ module RedisCluster
|
|
11
11
|
# TODO: type check
|
12
12
|
def add_node!(node_options, slots)
|
13
13
|
new_node = Node.new(global_configs.merge(node_options))
|
14
|
-
node = @nodes.find {|n| n.name == new_node.name } || new_node
|
14
|
+
node = @nodes.find { |n| n.name == new_node.name } || new_node
|
15
15
|
node.slots = slots
|
16
16
|
@nodes.push(node).uniq!
|
17
17
|
end
|
18
18
|
|
19
19
|
def delete_except!(master_hosts)
|
20
|
-
names = master_hosts.map {|host, port| "#{host}:#{port}" }
|
21
|
-
@nodes.delete_if {|n| !names.include?(n.name) }
|
20
|
+
names = master_hosts.map { |host, port| "#{host}:#{port}" }
|
21
|
+
@nodes.delete_if { |n| !names.include?(n.name) }
|
22
22
|
end
|
23
23
|
|
24
24
|
# other_options:
|
@@ -40,6 +40,10 @@ module RedisCluster
|
|
40
40
|
on_each_node(:keys, glob).flatten
|
41
41
|
end
|
42
42
|
|
43
|
+
def script(args, &block)
|
44
|
+
on_each_node(:script, *args).flatten
|
45
|
+
end
|
46
|
+
|
43
47
|
# Now mutli & pipelined conmand must control keys at same slot yourself
|
44
48
|
# You can use hash tag: '{foo}1'
|
45
49
|
def multi(args, &block)
|
@@ -54,7 +58,7 @@ module RedisCluster
|
|
54
58
|
|
55
59
|
def node_by(key)
|
56
60
|
slot = Slot.slot_by(key)
|
57
|
-
@nodes.find {|node| node.has_slot?(slot) }
|
61
|
+
@nodes.find { |node| node.has_slot?(slot) }
|
58
62
|
end
|
59
63
|
|
60
64
|
def random_node
|
@@ -65,6 +69,10 @@ module RedisCluster
|
|
65
69
|
case method.to_s.downcase
|
66
70
|
when 'info', 'exec', 'slaveof', 'config', 'shutdown'
|
67
71
|
nil
|
72
|
+
when 'eval', 'evalsha'
|
73
|
+
raise KeyNotAppointError if args[1].nil? || args[1].empty?
|
74
|
+
raise KeysNotAtSameSlotError unless Slot.at_one?(args[1])
|
75
|
+
return args[1][0]
|
68
76
|
else
|
69
77
|
return args.first
|
70
78
|
end
|
data/lib/redis_cluster/slot.rb
CHANGED
@@ -3,7 +3,7 @@ module RedisCluster
|
|
3
3
|
class Slot
|
4
4
|
KEY_PATTERN = /\{([^\}]*)\}/
|
5
5
|
|
6
|
-
#
|
6
|
+
# hash tag key "{xxx}ooo" will calculate "xxx" for slot
|
7
7
|
# if key is "{}dddd", calculate "{}dddd" for slot
|
8
8
|
def self.slot_by(key)
|
9
9
|
key = key.to_s
|
@@ -12,6 +12,11 @@ module RedisCluster
|
|
12
12
|
CRC16.crc16(key) % Configuration::HASH_SLOTS
|
13
13
|
end
|
14
14
|
|
15
|
+
# check if keys at same slot
|
16
|
+
def self.at_one?(keys)
|
17
|
+
keys.map { |k| slot_by(k) }.uniq.size == 1
|
18
|
+
end
|
19
|
+
|
15
20
|
end # end Slot
|
16
21
|
|
17
22
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis_cluster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- wangzc
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|