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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 41b457f6ceafa44ab6ace3d09ad557fda6fec135
4
- data.tar.gz: d92d1ad1c22b95dfa7f15c282bec660dd9f93072
3
+ metadata.gz: d5f4f4dd87bea457c22bcb596945c12e2cffad6b
4
+ data.tar.gz: 9cce133f24ba35be564f9a241513a8ae28a49254
5
5
  SHA512:
6
- metadata.gz: df2c72b585d8f4c065abed593b3362c4f5bd0276f0e488151a9698fe5db8fe47e5db5b3ba688ff11e3f5f2c64792809be43b6f13511d75a9ab278188334de2a1
7
- data.tar.gz: 5a4b84c9e6a6db6b4a685c9d329de132593d67744feccc315f27f9a10b8d8da23efd7f205bab22f5b6aa1fe2514a3ce4d461b7db83f686bb69fbac3d70d6852a
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.
@@ -1,4 +1,4 @@
1
- require "thread"
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 == "ASK"
31
- asking = true
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(persist expire expireat ttl pexpire pexpireat pttl dump restore del exists move type decr decrby incr incrby
9
- incrbyfloat set setex psetex setnx get setrange getrange setbit getbit append bitcount bitpos getset strlen [] []= llen lpush lpushx rpush
10
- rpushx lpop rpop blpop brpop lindex linsert lrange lrem lset ltrim scard sadd srem spop srandmember sismember smembers zcard zadd zincrby
11
- zrem zscore zrange zrevrange zrank zrevrank zremrangebyrank zrangebyscore zrevrangebyscore zremrangebyscore zcount hlen hset hsetnx
12
- hmset mapped_hmset hget hmget mapped_hmget hdel hexists hincrby hincrbyfloat hkeys hvals hgetall publish pfadd
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
@@ -1,5 +1,7 @@
1
1
  module RedisCluster
2
-
3
2
  NotSupportError = Class.new StandardError
4
3
 
4
+ KeysNotAtSameSlotError = Class.new StandardError
5
+
6
+ KeyNotAppointError = Class.new StandardError
5
7
  end
@@ -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
@@ -3,7 +3,7 @@ module RedisCluster
3
3
  class Slot
4
4
  KEY_PATTERN = /\{([^\}]*)\}/
5
5
 
6
- # has tag key "{xxx}ooo" will calculate "xxx" for slot
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
@@ -1,3 +1,3 @@
1
1
  module RedisCluster
2
- VERSION = "0.2.8"
2
+ VERSION = "0.2.9"
3
3
  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.8
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-03-30 00:00:00.000000000 Z
11
+ date: 2017-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis