redis-cluster 1.0.0.pre.rc.4 → 1.0.0

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: ae1424cf66cf0843a3300a70bf4dd23ce9699c56
4
- data.tar.gz: 898602e4c11a4267da6d7d427d57da29ae161eba
3
+ metadata.gz: 328dcd9bbc349a36b70a5f91bc16c69345bef62c
4
+ data.tar.gz: 32720a7f55ac9b912878eaf3a287bb940000f461
5
5
  SHA512:
6
- metadata.gz: f2748d2afac09200212d8141f4c8ad8568e3038a8da78bc0d0128be05c99280c24e7ba7336daea7daf80a49cf2f942353c5432c0986c091b2f266e226d6a02ff
7
- data.tar.gz: fa34f1114adc201170ee71c54f77c19624dc1bad37ad82cb83eed2500ed86bc0f42a6c086fd2b2281482dab94ac27656f886a29e6fced351d2215b0b68e784cb
6
+ metadata.gz: 7e35a19038dfac92f8c0968f44bf442a9eb225b324d2a066aed1aa83e110ea840582113cbda262e0c6323ccaac955eb6f8921b85585d8c91f602adba1913d863
7
+ data.tar.gz: 182e883b1fc704db0f1d8e2737fe9a1cc87209d37bf53dc2976f917d427d0ccf4cf400fcb7e7338119ec9e351aa8ed6aa7e62a909a5a209a4aa330a971e6bf98
@@ -18,6 +18,7 @@ class RedisCluster
18
18
  @replicas = nil
19
19
  @client_creater = block
20
20
 
21
+ @buffer = []
21
22
  init_client(seeds)
22
23
  end
23
24
 
@@ -41,9 +42,9 @@ class RedisCluster
41
42
  when :master
42
43
  slots[slot].first
43
44
  when :slave
44
- slots[slot][1..-1].select(&:healthy).sample || slots[slot].first
45
+ pick_client(slots[slot], skip: 1) || slots[slot].first
45
46
  when :master_slave
46
- slots[slot].select(&:healthy).sample
47
+ pick_client(slots[slot])
47
48
  end
48
49
  end
49
50
 
@@ -81,6 +82,24 @@ class RedisCluster
81
82
 
82
83
  private
83
84
 
85
+ def pick_client(pool, skip: 0)
86
+ unhealthy_count = 0
87
+
88
+ (skip...pool.length).each do |i|
89
+ if pool[i].healthy
90
+ @buffer[i - skip] = pool[i]
91
+ else
92
+ unhealthy_count += 1
93
+ end
94
+ end
95
+
96
+ buffer_length = pool.length - skip - unhealthy_count
97
+ return nil if buffer_length.zero?
98
+
99
+ i = rand(buffer_length)
100
+ @buffer[i]
101
+ end
102
+
84
103
  def slots_and_clients(client)
85
104
  replicas = ::Hash.new{ |h, k| h[k] = [] }
86
105
 
@@ -107,6 +126,7 @@ class RedisCluster
107
126
  end
108
127
  end
109
128
 
129
+ @buffer = Array.new(clients.length) if clients.length > @buffer.length
110
130
  @replicas = replicas
111
131
  end
112
132
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class RedisCluster
4
- VERSION = '1.0.0-rc.4'
4
+ VERSION = '1.0.0'
5
5
  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: 1.0.0.pre.rc.4
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bukalapak
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-16 00:00:00.000000000 Z
11
+ date: 2018-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -61,9 +61,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
61
61
  version: '0'
62
62
  required_rubygems_version: !ruby/object:Gem::Requirement
63
63
  requirements:
64
- - - ">"
64
+ - - ">="
65
65
  - !ruby/object:Gem::Version
66
- version: 1.3.1
66
+ version: '0'
67
67
  requirements: []
68
68
  rubyforge_project:
69
69
  rubygems_version: 2.5.1