redis 3.3.5 → 4.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +236 -2
  3. data/README.md +169 -89
  4. data/lib/redis/client.rb +176 -108
  5. data/lib/redis/cluster/command.rb +79 -0
  6. data/lib/redis/cluster/command_loader.rb +33 -0
  7. data/lib/redis/cluster/key_slot_converter.rb +72 -0
  8. data/lib/redis/cluster/node.rb +120 -0
  9. data/lib/redis/cluster/node_key.rb +31 -0
  10. data/lib/redis/cluster/node_loader.rb +34 -0
  11. data/lib/redis/cluster/option.rb +100 -0
  12. data/lib/redis/cluster/slot.rb +86 -0
  13. data/lib/redis/cluster/slot_loader.rb +46 -0
  14. data/lib/redis/cluster.rb +315 -0
  15. data/lib/redis/commands/bitmaps.rb +63 -0
  16. data/lib/redis/commands/cluster.rb +45 -0
  17. data/lib/redis/commands/connection.rb +58 -0
  18. data/lib/redis/commands/geo.rb +84 -0
  19. data/lib/redis/commands/hashes.rb +251 -0
  20. data/lib/redis/commands/hyper_log_log.rb +37 -0
  21. data/lib/redis/commands/keys.rb +455 -0
  22. data/lib/redis/commands/lists.rb +290 -0
  23. data/lib/redis/commands/pubsub.rb +72 -0
  24. data/lib/redis/commands/scripting.rb +114 -0
  25. data/lib/redis/commands/server.rb +188 -0
  26. data/lib/redis/commands/sets.rb +223 -0
  27. data/lib/redis/commands/sorted_sets.rb +812 -0
  28. data/lib/redis/commands/streams.rb +382 -0
  29. data/lib/redis/commands/strings.rb +313 -0
  30. data/lib/redis/commands/transactions.rb +139 -0
  31. data/lib/redis/commands.rb +240 -0
  32. data/lib/redis/connection/command_helper.rb +7 -10
  33. data/lib/redis/connection/hiredis.rb +5 -3
  34. data/lib/redis/connection/registry.rb +2 -1
  35. data/lib/redis/connection/ruby.rb +136 -128
  36. data/lib/redis/connection/synchrony.rb +24 -9
  37. data/lib/redis/connection.rb +3 -1
  38. data/lib/redis/distributed.rb +255 -85
  39. data/lib/redis/errors.rb +57 -0
  40. data/lib/redis/hash_ring.rb +30 -73
  41. data/lib/redis/pipeline.rb +178 -13
  42. data/lib/redis/subscribe.rb +11 -12
  43. data/lib/redis/version.rb +3 -1
  44. data/lib/redis.rb +174 -2661
  45. metadata +66 -202
  46. data/.gitignore +0 -16
  47. data/.travis/Gemfile +0 -11
  48. data/.travis.yml +0 -89
  49. data/.yardopts +0 -3
  50. data/Gemfile +0 -4
  51. data/Rakefile +0 -87
  52. data/benchmarking/logging.rb +0 -71
  53. data/benchmarking/pipeline.rb +0 -51
  54. data/benchmarking/speed.rb +0 -21
  55. data/benchmarking/suite.rb +0 -24
  56. data/benchmarking/worker.rb +0 -71
  57. data/examples/basic.rb +0 -15
  58. data/examples/consistency.rb +0 -114
  59. data/examples/dist_redis.rb +0 -43
  60. data/examples/incr-decr.rb +0 -17
  61. data/examples/list.rb +0 -26
  62. data/examples/pubsub.rb +0 -37
  63. data/examples/sentinel/sentinel.conf +0 -9
  64. data/examples/sentinel/start +0 -49
  65. data/examples/sentinel.rb +0 -41
  66. data/examples/sets.rb +0 -36
  67. data/examples/unicorn/config.ru +0 -3
  68. data/examples/unicorn/unicorn.rb +0 -20
  69. data/redis.gemspec +0 -44
  70. data/test/bitpos_test.rb +0 -69
  71. data/test/blocking_commands_test.rb +0 -42
  72. data/test/client_test.rb +0 -59
  73. data/test/command_map_test.rb +0 -30
  74. data/test/commands_on_hashes_test.rb +0 -21
  75. data/test/commands_on_hyper_log_log_test.rb +0 -21
  76. data/test/commands_on_lists_test.rb +0 -20
  77. data/test/commands_on_sets_test.rb +0 -77
  78. data/test/commands_on_sorted_sets_test.rb +0 -137
  79. data/test/commands_on_strings_test.rb +0 -101
  80. data/test/commands_on_value_types_test.rb +0 -133
  81. data/test/connection_handling_test.rb +0 -277
  82. data/test/connection_test.rb +0 -57
  83. data/test/db/.gitkeep +0 -0
  84. data/test/distributed_blocking_commands_test.rb +0 -46
  85. data/test/distributed_commands_on_hashes_test.rb +0 -10
  86. data/test/distributed_commands_on_hyper_log_log_test.rb +0 -33
  87. data/test/distributed_commands_on_lists_test.rb +0 -22
  88. data/test/distributed_commands_on_sets_test.rb +0 -83
  89. data/test/distributed_commands_on_sorted_sets_test.rb +0 -18
  90. data/test/distributed_commands_on_strings_test.rb +0 -59
  91. data/test/distributed_commands_on_value_types_test.rb +0 -95
  92. data/test/distributed_commands_requiring_clustering_test.rb +0 -164
  93. data/test/distributed_connection_handling_test.rb +0 -23
  94. data/test/distributed_internals_test.rb +0 -79
  95. data/test/distributed_key_tags_test.rb +0 -52
  96. data/test/distributed_persistence_control_commands_test.rb +0 -26
  97. data/test/distributed_publish_subscribe_test.rb +0 -92
  98. data/test/distributed_remote_server_control_commands_test.rb +0 -66
  99. data/test/distributed_scripting_test.rb +0 -102
  100. data/test/distributed_sorting_test.rb +0 -20
  101. data/test/distributed_test.rb +0 -58
  102. data/test/distributed_transactions_test.rb +0 -32
  103. data/test/encoding_test.rb +0 -18
  104. data/test/error_replies_test.rb +0 -59
  105. data/test/fork_safety_test.rb +0 -65
  106. data/test/helper.rb +0 -232
  107. data/test/helper_test.rb +0 -24
  108. data/test/internals_test.rb +0 -417
  109. data/test/lint/blocking_commands.rb +0 -150
  110. data/test/lint/hashes.rb +0 -162
  111. data/test/lint/hyper_log_log.rb +0 -60
  112. data/test/lint/lists.rb +0 -143
  113. data/test/lint/sets.rb +0 -140
  114. data/test/lint/sorted_sets.rb +0 -316
  115. data/test/lint/strings.rb +0 -260
  116. data/test/lint/value_types.rb +0 -122
  117. data/test/persistence_control_commands_test.rb +0 -26
  118. data/test/pipelining_commands_test.rb +0 -242
  119. data/test/publish_subscribe_test.rb +0 -282
  120. data/test/remote_server_control_commands_test.rb +0 -118
  121. data/test/scanning_test.rb +0 -413
  122. data/test/scripting_test.rb +0 -78
  123. data/test/sentinel_command_test.rb +0 -80
  124. data/test/sentinel_test.rb +0 -255
  125. data/test/sorting_test.rb +0 -59
  126. data/test/ssl_test.rb +0 -73
  127. data/test/support/connection/hiredis.rb +0 -1
  128. data/test/support/connection/ruby.rb +0 -1
  129. data/test/support/connection/synchrony.rb +0 -17
  130. data/test/support/redis_mock.rb +0 -130
  131. data/test/support/ssl/gen_certs.sh +0 -31
  132. data/test/support/ssl/trusted-ca.crt +0 -25
  133. data/test/support/ssl/trusted-ca.key +0 -27
  134. data/test/support/ssl/trusted-cert.crt +0 -81
  135. data/test/support/ssl/trusted-cert.key +0 -28
  136. data/test/support/ssl/untrusted-ca.crt +0 -26
  137. data/test/support/ssl/untrusted-ca.key +0 -27
  138. data/test/support/ssl/untrusted-cert.crt +0 -82
  139. data/test/support/ssl/untrusted-cert.key +0 -28
  140. data/test/support/wire/synchrony.rb +0 -24
  141. data/test/support/wire/thread.rb +0 -5
  142. data/test/synchrony_driver.rb +0 -88
  143. data/test/test.conf.erb +0 -9
  144. data/test/thread_safety_test.rb +0 -62
  145. data/test/transactions_test.rb +0 -264
  146. data/test/unknown_commands_test.rb +0 -14
  147. data/test/url_param_test.rb +0 -138
@@ -0,0 +1,223 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Redis
4
+ module Commands
5
+ module Sets
6
+ # Get the number of members in a set.
7
+ #
8
+ # @param [String] key
9
+ # @return [Integer]
10
+ def scard(key)
11
+ send_command([:scard, key])
12
+ end
13
+
14
+ # Add one or more members to a set.
15
+ #
16
+ # @param [String] key
17
+ # @param [String, Array<String>] member one member, or array of members
18
+ # @return [Boolean, Integer] `Boolean` when a single member is specified,
19
+ # holding whether or not adding the member succeeded, or `Integer` when an
20
+ # array of members is specified, holding the number of members that were
21
+ # successfully added
22
+ def sadd(key, member)
23
+ block = if Redis.sadd_returns_boolean && !member.is_a?(Array)
24
+ ::Redis.deprecate!(
25
+ "Redis#sadd will always return an Integer in Redis 5.0.0. Use Redis#sadd? instead." \
26
+ "(called from: #{caller(1, 1).first})"
27
+ )
28
+ Boolify
29
+ end
30
+ send_command([:sadd, key, member], &block)
31
+ end
32
+
33
+ # Add one or more members to a set.
34
+ #
35
+ # @param [String] key
36
+ # @param [String, Array<String>] member one member, or array of members
37
+ # @return [Boolean] Whether or not at least one member was added.
38
+ def sadd?(key, member)
39
+ send_command([:sadd, key, member], &Boolify)
40
+ end
41
+
42
+ # Remove one or more members from a set.
43
+ #
44
+ # @param [String] key
45
+ # @param [String, Array<String>] member one member, or array of members
46
+ # @return [Boolean, Integer] `Boolean` when a single member is specified,
47
+ # holding whether or not removing the member succeeded, or `Integer` when an
48
+ # array of members is specified, holding the number of members that were
49
+ # successfully removed
50
+ def srem(key, member)
51
+ block = if Redis.sadd_returns_boolean && !member.is_a?(Array)
52
+ ::Redis.deprecate!(
53
+ "Redis#srem will always return an Integer in Redis 5.0.0. Use Redis#srem? instead." \
54
+ "(called from: #{caller(1, 1).first})"
55
+ )
56
+ Boolify
57
+ end
58
+ send_command([:srem, key, member], &block)
59
+ end
60
+
61
+ # Remove one or more members from a set.
62
+ #
63
+ # @param [String] key
64
+ # @param [String, Array<String>] member one member, or array of members
65
+ # @return [Boolean] `Boolean` Whether or not a member was removed.
66
+ def srem?(key, member)
67
+ send_command([:srem, key, member], &Boolify)
68
+ end
69
+
70
+ # Remove and return one or more random member from a set.
71
+ #
72
+ # @param [String] key
73
+ # @return [String]
74
+ # @param [Integer] count
75
+ def spop(key, count = nil)
76
+ if count.nil?
77
+ send_command([:spop, key])
78
+ else
79
+ send_command([:spop, key, count])
80
+ end
81
+ end
82
+
83
+ # Get one or more random members from a set.
84
+ #
85
+ # @param [String] key
86
+ # @param [Integer] count
87
+ # @return [String]
88
+ def srandmember(key, count = nil)
89
+ if count.nil?
90
+ send_command([:srandmember, key])
91
+ else
92
+ send_command([:srandmember, key, count])
93
+ end
94
+ end
95
+
96
+ # Move a member from one set to another.
97
+ #
98
+ # @param [String] source source key
99
+ # @param [String] destination destination key
100
+ # @param [String] member member to move from `source` to `destination`
101
+ # @return [Boolean]
102
+ def smove(source, destination, member)
103
+ send_command([:smove, source, destination, member], &Boolify)
104
+ end
105
+
106
+ # Determine if a given value is a member of a set.
107
+ #
108
+ # @param [String] key
109
+ # @param [String] member
110
+ # @return [Boolean]
111
+ def sismember(key, member)
112
+ send_command([:sismember, key, member], &Boolify)
113
+ end
114
+
115
+ # Determine if multiple values are members of a set.
116
+ #
117
+ # @param [String] key
118
+ # @param [String, Array<String>] members
119
+ # @return [Array<Boolean>]
120
+ def smismember(key, *members)
121
+ send_command([:smismember, key, *members]) do |reply|
122
+ reply.map(&Boolify)
123
+ end
124
+ end
125
+
126
+ # Get all the members in a set.
127
+ #
128
+ # @param [String] key
129
+ # @return [Array<String>]
130
+ def smembers(key)
131
+ send_command([:smembers, key])
132
+ end
133
+
134
+ # Subtract multiple sets.
135
+ #
136
+ # @param [String, Array<String>] keys keys pointing to sets to subtract
137
+ # @return [Array<String>] members in the difference
138
+ def sdiff(*keys)
139
+ send_command([:sdiff, *keys])
140
+ end
141
+
142
+ # Subtract multiple sets and store the resulting set in a key.
143
+ #
144
+ # @param [String] destination destination key
145
+ # @param [String, Array<String>] keys keys pointing to sets to subtract
146
+ # @return [Integer] number of elements in the resulting set
147
+ def sdiffstore(destination, *keys)
148
+ send_command([:sdiffstore, destination, *keys])
149
+ end
150
+
151
+ # Intersect multiple sets.
152
+ #
153
+ # @param [String, Array<String>] keys keys pointing to sets to intersect
154
+ # @return [Array<String>] members in the intersection
155
+ def sinter(*keys)
156
+ send_command([:sinter, *keys])
157
+ end
158
+
159
+ # Intersect multiple sets and store the resulting set in a key.
160
+ #
161
+ # @param [String] destination destination key
162
+ # @param [String, Array<String>] keys keys pointing to sets to intersect
163
+ # @return [Integer] number of elements in the resulting set
164
+ def sinterstore(destination, *keys)
165
+ send_command([:sinterstore, destination, *keys])
166
+ end
167
+
168
+ # Add multiple sets.
169
+ #
170
+ # @param [String, Array<String>] keys keys pointing to sets to unify
171
+ # @return [Array<String>] members in the union
172
+ def sunion(*keys)
173
+ send_command([:sunion, *keys])
174
+ end
175
+
176
+ # Add multiple sets and store the resulting set in a key.
177
+ #
178
+ # @param [String] destination destination key
179
+ # @param [String, Array<String>] keys keys pointing to sets to unify
180
+ # @return [Integer] number of elements in the resulting set
181
+ def sunionstore(destination, *keys)
182
+ send_command([:sunionstore, destination, *keys])
183
+ end
184
+
185
+ # Scan a set
186
+ #
187
+ # @example Retrieve the first batch of keys in a set
188
+ # redis.sscan("set", 0)
189
+ #
190
+ # @param [String, Integer] cursor the cursor of the iteration
191
+ # @param [Hash] options
192
+ # - `:match => String`: only return keys matching the pattern
193
+ # - `:count => Integer`: return count keys at most per iteration
194
+ #
195
+ # @return [String, Array<String>] the next cursor and all found members
196
+ def sscan(key, cursor, **options)
197
+ _scan(:sscan, cursor, [key], **options)
198
+ end
199
+
200
+ # Scan a set
201
+ #
202
+ # @example Retrieve all of the keys in a set
203
+ # redis.sscan_each("set").to_a
204
+ # # => ["key1", "key2", "key3"]
205
+ #
206
+ # @param [Hash] options
207
+ # - `:match => String`: only return keys matching the pattern
208
+ # - `:count => Integer`: return count keys at most per iteration
209
+ #
210
+ # @return [Enumerator] an enumerator for all keys in the set
211
+ def sscan_each(key, **options, &block)
212
+ return to_enum(:sscan_each, key, **options) unless block_given?
213
+
214
+ cursor = 0
215
+ loop do
216
+ cursor, keys = sscan(key, cursor, **options)
217
+ keys.each(&block)
218
+ break if cursor == "0"
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end