redis_cluster 0.2.8 → 0.2.9

Sign up to get free protection for your applications and to get access to all the features.
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