redis-cluster 0.0.7 → 0.0.8

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: 703b89b40d08e4c0df9bf8eae2ac03add59c8ef6
4
- data.tar.gz: b592ec99efaf8aea624538b421c0481d2dc1b42d
3
+ metadata.gz: aef27de1754b1b2a7106672eeec3073a431d0d8a
4
+ data.tar.gz: 8762651a0de67037a3118a0b4fbf87fb95d85b36
5
5
  SHA512:
6
- metadata.gz: 5ef6234f0223f21cc93baa713c732afa01f638b1d7daf7d99d5c7e63d06d04449b837d31b781b7861cfba1d9f0d12fb972409eea9be71620f5c2a45f9977e2e7
7
- data.tar.gz: ca36b2b72dd9e41e7a39c6caf5b5b5b1bba62c4048a7ca998702c688924aff9320ffc97bf2f37f1274e25b8e04e2489f469cb242c60fab4a8669a63764c52afd
6
+ metadata.gz: a23e10568bcf5058159a96a5e838f2b89c74909ae8bf9930f09906f3d4526322415cca104899a164b143af4ce7cb1f1e31e8afcd8c142dc25122521814287682
7
+ data.tar.gz: 020d80d301681e521ec0aec29031bf1451197c12406b6597a58d404acb92456b95f7895600477cec0c388a396300475a3fd29b6f87dff76e8bf7845b64dcb6a2
data/README.md CHANGED
@@ -2,35 +2,101 @@
2
2
  [![CircleCI](https://circleci.com/gh/bukalapak/redis-cluster.svg?style=shield&circle-token=5ebe750ce74100b7bc18768395ec3e4ebd9f1a43)](https://circleci.com/gh/bukalapak/redis-cluster)
3
3
  [![Coverage](https://codecov.io/gh/bukalapak/redis-cluster/branch/master/graph/badge.svg?token=cPZvgDYAft)](https://codecov.io/gh/bukalapak/redis-cluster)
4
4
 
5
- ## Getting started
5
+ ## Description
6
6
 
7
- Install redis-cluster.
8
- ````ruby
9
- gem install 'redis-cluster'
10
- ````
7
+ redis-cluster is redis cluster client for ruby that support pipelining.
11
8
 
12
- This will start a redis from seed servers. Currently it only support master read configuration.
13
- ````ruby
14
- seed = ['127.0.0.1:7001', '127.0.0.1:7002']
15
- redis = RedisCluster.new(seed, redis_opts: { timeout: 5, connect_timeout: 1 }, cluster_opts: { read_mode: :master_slave, silent: true, logger: Logger.new })
16
- ````
9
+ ## Owner
17
10
 
18
- ## Configuration
11
+ SRE Bukalapak
12
+
13
+ ## Contact
14
+
15
+ [Contributors](https://github.com/bukalapak/redis-cluster/graphs/contributors)
16
+
17
+ ## Onboarding and Development Guide
18
+
19
+ ### Getting started
20
+
21
+ 1. Install redis-cluster
22
+
23
+ ````ruby
24
+ gem install 'redis-cluster'
25
+ ````
26
+
27
+ 2. Start `irb`. This command will start a redis-cluster client from seed servers.
28
+
29
+ ````ruby
30
+ seed = ['127.0.0.1:7001', '127.0.0.1:7002']
31
+ redis = RedisCluster.new(
32
+ seed,
33
+ redis_opts: { timeout: 5, connect_timeout: 1 },
34
+ cluster_opts: { force_cluster: false, read_mode: :master_slave, silent: true, logger: Logger.new }
35
+ )
36
+ ````
37
+
38
+ ### Development Guide
39
+
40
+ 1. You need [rvm](https://rvm.io) and [bundler](http://bundler.io/) to test.
41
+ See [here](https://rvm.io/rvm/install) to install `rvm`.
42
+ And run these commands to install `bundler` and other dependencies
43
+
44
+ ````
45
+ gem install bundler
46
+ bundle install
47
+ ````
48
+
49
+ 2. You also need redis binary.
50
+ See [here](https://redis.io/download) to install `redis`
51
+
52
+ 3. Fork this repo
53
+
54
+ 4. Make your change and it's test.
55
+
56
+ ````
57
+ vim lib/**.rb
58
+ vim spec/**_spec.rb
59
+ ````
60
+
61
+ 5. Optionally, run the test in your local
62
+
63
+ ````
64
+ rake # run all test and lint
65
+ ````
66
+
67
+ 6. Commit and push your change to upstream
68
+
69
+ ````
70
+ git commit -m "message"
71
+ git push # add "--set-upstream branch_name" after "git push" if you haven't set the upstream
72
+ ````
73
+
74
+ 7. Open pull request in `Github`
75
+
76
+ 8. If test in CI is success, ask someone to review your code.
77
+
78
+ 9. If review is passed, your pull request can be merged.
79
+
80
+ ### Configuration
81
+
82
+ #### redis_opts
19
83
 
20
- ### redis_opts
21
84
  Option for Redis::Client instance. Set timeout, ssl, etc here.
22
85
 
23
- ### cluster_opts
86
+ #### cluster_opts
87
+
24
88
  Option for RedisCluster.
89
+ - `force_cluster`: if true, RedisCluster will only work on clustered Redis or otherwise can also work on standalone Redis. The default value is `false`.
25
90
  - `read_mode`: for read command, RedisClient can try to read from slave if specified. Supported option is `:master`(default), `:slave`, and `:master_slave`.
26
91
  - `silent`: whether or not RedisCluster will raise error.
27
92
  - `logger`: if specified. RedisCluster will log all of RedisCluster errors here.
28
93
 
29
- ## Limitation
94
+ ### Limitation
95
+
30
96
  All multi keys operation, cluster command, multi-exec, and some commands are not supported.
31
97
 
32
- ## Pipeline
98
+ ### Pipeline
99
+
33
100
  Can be used with same interface as standalone redis client. See [redis pipeline](https://github.com/redis/redis-rb#pipelining)
34
101
 
35
- ## Contributing
36
- [Fork the project](https://github.com/bukalapak/redis-cluster) and send pull requests.
102
+ ## FAQ
data/lib/redis-cluster.rb CHANGED
@@ -15,7 +15,8 @@ class RedisCluster
15
15
 
16
16
  def initialize(seeds, redis_opts: nil, cluster_opts: nil)
17
17
  @options = cluster_opts || {}
18
- @cluster = Cluster.new(seeds, redis_opts || {})
18
+ cluster_options = redis_opts || {}
19
+ @cluster = Cluster.new(seeds, cluster_options.merge(force_cluster: force_cluster?))
19
20
 
20
21
  super()
21
22
  end
@@ -32,6 +33,10 @@ class RedisCluster
32
33
  options[:read_mode] || :master
33
34
  end
34
35
 
36
+ def force_cluster?
37
+ options[:force_cluster]
38
+ end
39
+
35
40
  def connected?
36
41
  cluster.connected?
37
42
  end
@@ -18,6 +18,10 @@ class RedisCluster
18
18
  init_client(seeds)
19
19
  end
20
20
 
21
+ def force_cluster?
22
+ options[:force_cluster]
23
+ end
24
+
21
25
  # Return Redis::Client for a given key.
22
26
  # Modified from https://github.com/antirez/redis-rb-cluster/blob/master/cluster.rb#L104-L117
23
27
  def slot_for(key)
@@ -75,17 +79,26 @@ class RedisCluster
75
79
  def slots_and_clients(client)
76
80
  replicas = ::Hash.new{ |h, k| h[k] = [] }
77
81
 
78
- client.call([:cluster, :slots]).tap do |result|
79
- result.each do |arr|
80
- arr[2..-1].each_with_index do |a, i|
81
- cli = self["#{a[0]}:#{a[1]}"]
82
- replicas[arr[0]] << cli
83
- cli.call([:readonly]) if i.nonzero?
84
- end
85
-
86
- (arr[0]..arr[1]).each do |slot|
87
- slots[slot] = replicas[arr[0]]
88
- end
82
+ result = client.call([:cluster, :slots])
83
+ if result.is_a?(StandardError)
84
+ if result.message.eql?('ERR This instance has cluster support disabled') &&
85
+ !force_cluster?
86
+ host, port = client.url.split(':', 2)
87
+ result = [[0, HASH_SLOTS - 1, [host, port, nil], [host, port, nil]]]
88
+ else
89
+ raise result
90
+ end
91
+ end
92
+
93
+ result.each do |arr|
94
+ arr[2..-1].each_with_index do |a, i|
95
+ cli = self["#{a[0]}:#{a[1]}"]
96
+ replicas[arr[0]] << cli
97
+ cli.call([:readonly]) if i.nonzero?
98
+ end
99
+
100
+ (arr[0]..arr[1]).each do |slot|
101
+ slots[slot] = replicas[arr[0]]
89
102
  end
90
103
  end
91
104
 
@@ -112,7 +125,10 @@ class RedisCluster
112
125
 
113
126
  def create_client(url)
114
127
  host, port = url.split(':', 2)
115
- Client.new(options.merge(host: host, port: port))
128
+ client_options = options.clone.tap do |opts|
129
+ opts.delete(:force_update)
130
+ end
131
+ Client.new(client_options.merge(host: host, port: port))
116
132
  end
117
133
 
118
134
  # -----------------------------------------------------------------------------
@@ -8,8 +8,8 @@ class RedisCluster
8
8
  # see https://redis.io/commands#set. Most of the code are copied from
9
9
  # https://github.com/redis/redis-rb/blob/master/lib/redis.rb.
10
10
  #
11
- # SETTER = [:sadd, :spop, :srem]
12
- # GETTER = [:scard, :sismembers, :smembers, :srandmember, :sscan]
11
+ # SETTER = [:sadd, :spop, :srem, :sdiffstore, :sinterstore, :smove, :sunionstore]
12
+ # GETTER = [:scard, :sismember, :smembers, :srandmember, :sscan, :sdiff, :sinter, :sunion]
13
13
  module Set
14
14
 
15
15
  # Get the number of members in a set.
@@ -78,6 +78,69 @@ class RedisCluster
78
78
  def smembers(key)
79
79
  call(key, [:smembers, key], read: true)
80
80
  end
81
+
82
+ # Subtract multiple sets.
83
+ #
84
+ # @param [String, Array<String>] keys keys pointing to sets to subtract
85
+ # @return [Array<String>] members in the difference
86
+ def sdiff(*keys)
87
+ call(keys, [:sdiff] + keys, read: true)
88
+ end
89
+
90
+ # Subtract multiple sets and store the resulting set in a key.
91
+ #
92
+ # @param [String] destination destination key
93
+ # @param [String, Array<String>] keys keys pointing to sets to subtract
94
+ # @return [Fixnum] number of elements in the resulting set
95
+ def sdiffstore(destination, *keys)
96
+ call([keys, destination], [:sdiffstore, destination] + keys)
97
+ end
98
+
99
+ # Intersect multiple sets.
100
+ #
101
+ # @param [String, Array<String>] keys keys pointing to sets to intersect
102
+ # @return [Array<String>] members in the intersection
103
+ def sinter(*keys)
104
+ call(keys, [:sinter] + keys, read: true)
105
+ end
106
+
107
+ # Intersect multiple sets and store the resulting set in a key.
108
+ #
109
+ # @param [String] destination destination key
110
+ # @param [String, Array<String>] keys keys pointing to sets to intersect
111
+ # @return [Fixnum] number of elements in the resulting set
112
+ def sinterstore(destination, *keys)
113
+ call([keys, destination], [:sinterstore, destination] + keys)
114
+ end
115
+
116
+ # Move a member from one set to another.
117
+ #
118
+ # @param [String] source source key
119
+ # @param [String] destination destination key
120
+ # @param [String] member member to move from `source` to `destination`
121
+ # @return [Boolean]
122
+ def smove(source, destination, member)
123
+ call([source, destination],
124
+ [:smove, source, destination, member],
125
+ transform: Redis::Boolify)
126
+ end
127
+
128
+ # Add multiple sets.
129
+ #
130
+ # @param [String, Array<String>] keys keys pointing to sets to unify
131
+ # @return [Array<String>] members in the union
132
+ def sunion(*keys)
133
+ call(keys, [:sunion] + keys, read: true)
134
+ end
135
+
136
+ # Add multiple sets and store the resulting set in a key.
137
+ #
138
+ # @param [String] destination destination key
139
+ # @param [String, Array<String>] keys keys pointing to sets to unify
140
+ # @return [Fixnum] number of elements in the resulting set
141
+ def sunionstore(destination, *keys)
142
+ call([keys, destination], [:sunionstore, destination] + keys)
143
+ end
81
144
  end
82
145
  end
83
146
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class RedisCluster
4
- VERSION = '0.0.7'
4
+ VERSION = '0.0.8'
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: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bukalapak
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-18 00:00:00.000000000 Z
11
+ date: 2017-08-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis