redis 3.0.1 → 3.0.2
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.
- data/CHANGELOG.md +21 -0
- data/README.md +3 -3
- data/examples/pubsub.rb +18 -12
- data/lib/redis.rb +165 -164
- data/lib/redis/client.rb +46 -6
- data/lib/redis/connection/ruby.rb +44 -12
- data/lib/redis/connection/synchrony.rb +11 -6
- data/lib/redis/distributed.rb +7 -4
- data/lib/redis/pipeline.rb +9 -4
- data/lib/redis/subscribe.rb +2 -2
- data/lib/redis/version.rb +1 -1
- data/test/distributed_internals_test.rb +26 -0
- data/test/distributed_remote_server_control_commands_test.rb +1 -1
- data/test/internals_test.rb +18 -0
- data/test/lint/sorted_sets.rb +37 -0
- data/test/lint/value_types.rb +12 -12
- data/test/remote_server_control_commands_test.rb +1 -1
- data/test/synchrony_driver.rb +32 -1
- data/test/transactions_test.rb +21 -5
- data/test/url_param_test.rb +68 -0
- metadata +2 -2
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
# 3.0.2 (unreleased)
|
2
|
+
|
3
|
+
* Unescape CGI escaped password in URL.
|
4
|
+
|
5
|
+
* Fix test to check availability of `UNIXSocket`.
|
6
|
+
|
7
|
+
* Fix handling of score = +/- infinity for sorted set commands.
|
8
|
+
|
9
|
+
* Replace array splats with concatenation where possible.
|
10
|
+
|
11
|
+
* Raise if `EXEC` returns an error.
|
12
|
+
|
13
|
+
* Passing a nil value in options hash no longer overwrites the default.
|
14
|
+
|
15
|
+
* Allow string keys in options hash passed to `Redis.new` or
|
16
|
+
`Redis.connect`.
|
17
|
+
|
18
|
+
* Fix uncaught error triggering unrelated error (synchrony driver).
|
19
|
+
|
20
|
+
See f7ffd5f1a628029691084de69e5b46699bb8b96d and #248.
|
21
|
+
|
1
22
|
# 3.0.1
|
2
23
|
|
3
24
|
* Fix reconnect logic not kicking in on a write error.
|
data/README.md
CHANGED
@@ -163,7 +163,7 @@ It is best to use hiredis when you have large replies (for example:
|
|
163
163
|
In your Gemfile, include hiredis:
|
164
164
|
|
165
165
|
```ruby
|
166
|
-
gem "redis", "~> 3.0.
|
166
|
+
gem "redis", "~> 3.0.1"
|
167
167
|
gem "hiredis", "~> 0.4.5"
|
168
168
|
```
|
169
169
|
|
@@ -186,12 +186,12 @@ protocol.
|
|
186
186
|
In your Gemfile, include em-synchrony and hiredis:
|
187
187
|
|
188
188
|
```ruby
|
189
|
-
gem "redis", "~> 3.0.
|
189
|
+
gem "redis", "~> 3.0.1"
|
190
190
|
gem "hiredis", "~> 0.4.5"
|
191
191
|
gem "em-synchrony"
|
192
192
|
```
|
193
193
|
|
194
|
-
When instantiating the client object, specify
|
194
|
+
When instantiating the client object, specify synchrony:
|
195
195
|
|
196
196
|
```ruby
|
197
197
|
redis = Redis.new(:driver => :synchrony)
|
data/examples/pubsub.rb
CHANGED
@@ -15,17 +15,23 @@ redis = Redis.new
|
|
15
15
|
|
16
16
|
trap(:INT) { puts; exit }
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
18
|
+
begin
|
19
|
+
redis.subscribe(:one, :two) do |on|
|
20
|
+
on.subscribe do |channel, subscriptions|
|
21
|
+
puts "Subscribed to ##{channel} (#{subscriptions} subscriptions)"
|
22
|
+
end
|
23
|
+
|
24
|
+
on.message do |channel, message|
|
25
|
+
puts "##{channel}: #{message}"
|
26
|
+
redis.unsubscribe if message == "exit"
|
27
|
+
end
|
28
|
+
|
29
|
+
on.unsubscribe do |channel, subscriptions|
|
30
|
+
puts "Unsubscribed from ##{channel} (#{subscriptions} subscriptions)"
|
31
|
+
end
|
30
32
|
end
|
33
|
+
rescue Redis::BaseConnectionError => error
|
34
|
+
puts "#{error}, retrying in 1s"
|
35
|
+
sleep 1
|
36
|
+
retry
|
31
37
|
end
|
data/lib/redis.rb
CHANGED
@@ -55,7 +55,7 @@ class Redis
|
|
55
55
|
# @return [String] `OK`
|
56
56
|
def auth(password)
|
57
57
|
synchronize do |client|
|
58
|
-
client.call
|
58
|
+
client.call([:auth, password])
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
@@ -66,7 +66,7 @@ class Redis
|
|
66
66
|
def select(db)
|
67
67
|
synchronize do |client|
|
68
68
|
client.db = db
|
69
|
-
client.call
|
69
|
+
client.call([:select, db])
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
@@ -75,7 +75,7 @@ class Redis
|
|
75
75
|
# @return [String] `PONG`
|
76
76
|
def ping
|
77
77
|
synchronize do |client|
|
78
|
-
client.call
|
78
|
+
client.call([:ping])
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
@@ -85,7 +85,7 @@ class Redis
|
|
85
85
|
# @return [String]
|
86
86
|
def echo(value)
|
87
87
|
synchronize do |client|
|
88
|
-
client.call
|
88
|
+
client.call([:echo, value])
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
@@ -95,7 +95,7 @@ class Redis
|
|
95
95
|
def quit
|
96
96
|
synchronize do |client|
|
97
97
|
begin
|
98
|
-
client.call
|
98
|
+
client.call([:quit])
|
99
99
|
rescue ConnectionError
|
100
100
|
ensure
|
101
101
|
client.disconnect
|
@@ -108,7 +108,7 @@ class Redis
|
|
108
108
|
# @return [String] `OK`
|
109
109
|
def bgrewriteaof
|
110
110
|
synchronize do |client|
|
111
|
-
client.call
|
111
|
+
client.call([:bgrewriteaof])
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
@@ -117,7 +117,7 @@ class Redis
|
|
117
117
|
# @return [String] `OK`
|
118
118
|
def bgsave
|
119
119
|
synchronize do |client|
|
120
|
-
client.call
|
120
|
+
client.call([:bgsave])
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
@@ -128,9 +128,9 @@ class Redis
|
|
128
128
|
# property with `CONFIG GET`
|
129
129
|
def config(action, *args)
|
130
130
|
synchronize do |client|
|
131
|
-
client.call
|
131
|
+
client.call([:config, action] + args) do |reply|
|
132
132
|
if reply.kind_of?(Array) && action == :get
|
133
|
-
Hash[
|
133
|
+
Hash[reply.each_slice(2).to_a]
|
134
134
|
else
|
135
135
|
reply
|
136
136
|
end
|
@@ -143,13 +143,13 @@ class Redis
|
|
143
143
|
# @return [Fixnum]
|
144
144
|
def dbsize
|
145
145
|
synchronize do |client|
|
146
|
-
client.call
|
146
|
+
client.call([:dbsize])
|
147
147
|
end
|
148
148
|
end
|
149
149
|
|
150
150
|
def debug(*args)
|
151
151
|
synchronize do |client|
|
152
|
-
client.call
|
152
|
+
client.call([:debug] + args)
|
153
153
|
end
|
154
154
|
end
|
155
155
|
|
@@ -158,7 +158,7 @@ class Redis
|
|
158
158
|
# @return [String] `OK`
|
159
159
|
def flushall
|
160
160
|
synchronize do |client|
|
161
|
-
client.call
|
161
|
+
client.call([:flushall])
|
162
162
|
end
|
163
163
|
end
|
164
164
|
|
@@ -167,7 +167,7 @@ class Redis
|
|
167
167
|
# @return [String] `OK`
|
168
168
|
def flushdb
|
169
169
|
synchronize do |client|
|
170
|
-
client.call
|
170
|
+
client.call([:flushdb])
|
171
171
|
end
|
172
172
|
end
|
173
173
|
|
@@ -177,7 +177,7 @@ class Redis
|
|
177
177
|
# @return [Hash<String, String>]
|
178
178
|
def info(cmd = nil)
|
179
179
|
synchronize do |client|
|
180
|
-
client.call
|
180
|
+
client.call([:info, cmd].compact) do |reply|
|
181
181
|
if reply.kind_of?(String)
|
182
182
|
reply = Hash[reply.split("\r\n").map do |line|
|
183
183
|
line.split(":", 2) unless line =~ /^(#|$)/
|
@@ -186,7 +186,8 @@ class Redis
|
|
186
186
|
if cmd && cmd.to_s == "commandstats"
|
187
187
|
# Extract nested hashes for INFO COMMANDSTATS
|
188
188
|
reply = Hash[reply.map do |k, v|
|
189
|
-
|
189
|
+
v = v.split(",").map { |e| e.split("=") }
|
190
|
+
[k[/^cmdstat_(.*)$/, 1], Hash[v]]
|
190
191
|
end]
|
191
192
|
end
|
192
193
|
end
|
@@ -201,7 +202,7 @@ class Redis
|
|
201
202
|
# @return [Fixnum]
|
202
203
|
def lastsave
|
203
204
|
synchronize do |client|
|
204
|
-
client.call
|
205
|
+
client.call([:lastsave])
|
205
206
|
end
|
206
207
|
end
|
207
208
|
|
@@ -222,7 +223,7 @@ class Redis
|
|
222
223
|
# @return [String]
|
223
224
|
def save
|
224
225
|
synchronize do |client|
|
225
|
-
client.call
|
226
|
+
client.call([:save])
|
226
227
|
end
|
227
228
|
end
|
228
229
|
|
@@ -231,7 +232,7 @@ class Redis
|
|
231
232
|
synchronize do |client|
|
232
233
|
client.with_reconnect(false) do
|
233
234
|
begin
|
234
|
-
client.call
|
235
|
+
client.call([:shutdown])
|
235
236
|
rescue ConnectionError
|
236
237
|
# This means Redis has probably exited.
|
237
238
|
nil
|
@@ -243,7 +244,7 @@ class Redis
|
|
243
244
|
# Make the server a slave of another instance, or promote it as master.
|
244
245
|
def slaveof(host, port)
|
245
246
|
synchronize do |client|
|
246
|
-
client.call
|
247
|
+
client.call([:slaveof, host, port])
|
247
248
|
end
|
248
249
|
end
|
249
250
|
|
@@ -263,7 +264,7 @@ class Redis
|
|
263
264
|
# Internal command used for replication.
|
264
265
|
def sync
|
265
266
|
synchronize do |client|
|
266
|
-
client.call
|
267
|
+
client.call([:sync])
|
267
268
|
end
|
268
269
|
end
|
269
270
|
|
@@ -276,7 +277,7 @@ class Redis
|
|
276
277
|
# microseconds in the current second
|
277
278
|
def time
|
278
279
|
synchronize do |client|
|
279
|
-
client.call
|
280
|
+
client.call([:time]) do |reply|
|
280
281
|
reply.map(&:to_i) if reply
|
281
282
|
end
|
282
283
|
end
|
@@ -288,7 +289,7 @@ class Redis
|
|
288
289
|
# @return [Boolean] whether the timeout was removed or not
|
289
290
|
def persist(key)
|
290
291
|
synchronize do |client|
|
291
|
-
client.call
|
292
|
+
client.call([:persist, key], &_boolify)
|
292
293
|
end
|
293
294
|
end
|
294
295
|
|
@@ -299,7 +300,7 @@ class Redis
|
|
299
300
|
# @return [Boolean] whether the timeout was set or not
|
300
301
|
def expire(key, seconds)
|
301
302
|
synchronize do |client|
|
302
|
-
client.call
|
303
|
+
client.call([:expire, key, seconds], &_boolify)
|
303
304
|
end
|
304
305
|
end
|
305
306
|
|
@@ -310,7 +311,7 @@ class Redis
|
|
310
311
|
# @return [Boolean] whether the timeout was set or not
|
311
312
|
def expireat(key, unix_time)
|
312
313
|
synchronize do |client|
|
313
|
-
client.call
|
314
|
+
client.call([:expireat, key, unix_time], &_boolify)
|
314
315
|
end
|
315
316
|
end
|
316
317
|
|
@@ -321,7 +322,7 @@ class Redis
|
|
321
322
|
# key does not exist or does not have a timeout
|
322
323
|
def ttl(key)
|
323
324
|
synchronize do |client|
|
324
|
-
client.call
|
325
|
+
client.call([:ttl, key])
|
325
326
|
end
|
326
327
|
end
|
327
328
|
|
@@ -332,7 +333,7 @@ class Redis
|
|
332
333
|
# @return [Boolean] whether the timeout was set or not
|
333
334
|
def pexpire(key, milliseconds)
|
334
335
|
synchronize do |client|
|
335
|
-
client.call
|
336
|
+
client.call([:pexpire, key, milliseconds], &_boolify)
|
336
337
|
end
|
337
338
|
end
|
338
339
|
|
@@ -343,7 +344,7 @@ class Redis
|
|
343
344
|
# @return [Boolean] whether the timeout was set or not
|
344
345
|
def pexpireat(key, ms_unix_time)
|
345
346
|
synchronize do |client|
|
346
|
-
client.call
|
347
|
+
client.call([:pexpireat, key, ms_unix_time], &_boolify)
|
347
348
|
end
|
348
349
|
end
|
349
350
|
|
@@ -354,7 +355,7 @@ class Redis
|
|
354
355
|
# key does not exist or does not have a timeout
|
355
356
|
def pttl(key)
|
356
357
|
synchronize do |client|
|
357
|
-
client.call
|
358
|
+
client.call([:pttl, key])
|
358
359
|
end
|
359
360
|
end
|
360
361
|
|
@@ -364,7 +365,7 @@ class Redis
|
|
364
365
|
# @return [Fixnum] number of keys that were deleted
|
365
366
|
def del(*keys)
|
366
367
|
synchronize do |client|
|
367
|
-
client.call
|
368
|
+
client.call([:del] + keys)
|
368
369
|
end
|
369
370
|
end
|
370
371
|
|
@@ -374,7 +375,7 @@ class Redis
|
|
374
375
|
# @return [Boolean]
|
375
376
|
def exists(key)
|
376
377
|
synchronize do |client|
|
377
|
-
client.call
|
378
|
+
client.call([:exists, key], &_boolify)
|
378
379
|
end
|
379
380
|
end
|
380
381
|
|
@@ -384,7 +385,7 @@ class Redis
|
|
384
385
|
# @return [Array<String>]
|
385
386
|
def keys(pattern = "*")
|
386
387
|
synchronize do |client|
|
387
|
-
client.call
|
388
|
+
client.call([:keys, pattern]) do |reply|
|
388
389
|
if reply.kind_of?(String)
|
389
390
|
reply.split(" ")
|
390
391
|
else
|
@@ -415,13 +416,13 @@ class Redis
|
|
415
416
|
# @return [Boolean] whether the key was moved or not
|
416
417
|
def move(key, db)
|
417
418
|
synchronize do |client|
|
418
|
-
client.call
|
419
|
+
client.call([:move, key, db], &_boolify)
|
419
420
|
end
|
420
421
|
end
|
421
422
|
|
422
423
|
def object(*args)
|
423
424
|
synchronize do |client|
|
424
|
-
client.call
|
425
|
+
client.call([:object] + args)
|
425
426
|
end
|
426
427
|
end
|
427
428
|
|
@@ -430,7 +431,7 @@ class Redis
|
|
430
431
|
# @return [String]
|
431
432
|
def randomkey
|
432
433
|
synchronize do |client|
|
433
|
-
client.call
|
434
|
+
client.call([:randomkey])
|
434
435
|
end
|
435
436
|
end
|
436
437
|
|
@@ -441,7 +442,7 @@ class Redis
|
|
441
442
|
# @return [String] `OK`
|
442
443
|
def rename(old_name, new_name)
|
443
444
|
synchronize do |client|
|
444
|
-
client.call
|
445
|
+
client.call([:rename, old_name, new_name])
|
445
446
|
end
|
446
447
|
end
|
447
448
|
|
@@ -452,7 +453,7 @@ class Redis
|
|
452
453
|
# @return [Boolean] whether the key was renamed or not
|
453
454
|
def renamenx(old_name, new_name)
|
454
455
|
synchronize do |client|
|
455
|
-
client.call
|
456
|
+
client.call([:renamenx, old_name, new_name], &_boolify)
|
456
457
|
end
|
457
458
|
end
|
458
459
|
|
@@ -485,22 +486,22 @@ class Redis
|
|
485
486
|
args = []
|
486
487
|
|
487
488
|
by = options[:by]
|
488
|
-
args.concat
|
489
|
+
args.concat(["BY", by]) if by
|
489
490
|
|
490
491
|
limit = options[:limit]
|
491
|
-
args.concat
|
492
|
+
args.concat(["LIMIT"] + limit) if limit
|
492
493
|
|
493
494
|
get = Array(options[:get])
|
494
|
-
args.concat
|
495
|
+
args.concat(["GET"].product(get).flatten) unless get.empty?
|
495
496
|
|
496
497
|
order = options[:order]
|
497
|
-
args.concat
|
498
|
+
args.concat(order.split(" ")) if order
|
498
499
|
|
499
500
|
store = options[:store]
|
500
|
-
args.concat
|
501
|
+
args.concat(["STORE", store]) if store
|
501
502
|
|
502
503
|
synchronize do |client|
|
503
|
-
client.call
|
504
|
+
client.call([:sort, key] + args) do |reply|
|
504
505
|
if get.size > 1
|
505
506
|
if reply
|
506
507
|
reply.each_slice(get.size).to_a
|
@@ -518,7 +519,7 @@ class Redis
|
|
518
519
|
# @return [String] `string`, `list`, `set`, `zset`, `hash` or `none`
|
519
520
|
def type(key)
|
520
521
|
synchronize do |client|
|
521
|
-
client.call
|
522
|
+
client.call([:type, key])
|
522
523
|
end
|
523
524
|
end
|
524
525
|
|
@@ -532,7 +533,7 @@ class Redis
|
|
532
533
|
# @return [Fixnum] value after decrementing it
|
533
534
|
def decr(key)
|
534
535
|
synchronize do |client|
|
535
|
-
client.call
|
536
|
+
client.call([:decr, key])
|
536
537
|
end
|
537
538
|
end
|
538
539
|
|
@@ -547,7 +548,7 @@ class Redis
|
|
547
548
|
# @return [Fixnum] value after decrementing it
|
548
549
|
def decrby(key, decrement)
|
549
550
|
synchronize do |client|
|
550
|
-
client.call
|
551
|
+
client.call([:decrby, key, decrement])
|
551
552
|
end
|
552
553
|
end
|
553
554
|
|
@@ -561,7 +562,7 @@ class Redis
|
|
561
562
|
# @return [Fixnum] value after incrementing it
|
562
563
|
def incr(key)
|
563
564
|
synchronize do |client|
|
564
|
-
client.call
|
565
|
+
client.call([:incr, key])
|
565
566
|
end
|
566
567
|
end
|
567
568
|
|
@@ -576,7 +577,7 @@ class Redis
|
|
576
577
|
# @return [Fixnum] value after incrementing it
|
577
578
|
def incrby(key, increment)
|
578
579
|
synchronize do |client|
|
579
|
-
client.call
|
580
|
+
client.call([:incrby, key, increment])
|
580
581
|
end
|
581
582
|
end
|
582
583
|
|
@@ -591,8 +592,8 @@ class Redis
|
|
591
592
|
# @return [Float] value after incrementing it
|
592
593
|
def incrbyfloat(key, increment)
|
593
594
|
synchronize do |client|
|
594
|
-
client.call
|
595
|
-
|
595
|
+
client.call([:incrbyfloat, key, increment]) do |reply|
|
596
|
+
_floatify(reply) if reply
|
596
597
|
end
|
597
598
|
end
|
598
599
|
end
|
@@ -604,7 +605,7 @@ class Redis
|
|
604
605
|
# @return `"OK"`
|
605
606
|
def set(key, value)
|
606
607
|
synchronize do |client|
|
607
|
-
client.call
|
608
|
+
client.call([:set, key, value])
|
608
609
|
end
|
609
610
|
end
|
610
611
|
|
@@ -618,7 +619,7 @@ class Redis
|
|
618
619
|
# @return `"OK"`
|
619
620
|
def setex(key, ttl, value)
|
620
621
|
synchronize do |client|
|
621
|
-
client.call
|
622
|
+
client.call([:setex, key, ttl, value])
|
622
623
|
end
|
623
624
|
end
|
624
625
|
|
@@ -630,7 +631,7 @@ class Redis
|
|
630
631
|
# @return `"OK"`
|
631
632
|
def psetex(key, ttl, value)
|
632
633
|
synchronize do |client|
|
633
|
-
client.call
|
634
|
+
client.call([:psetex, key, ttl, value])
|
634
635
|
end
|
635
636
|
end
|
636
637
|
|
@@ -641,7 +642,7 @@ class Redis
|
|
641
642
|
# @return [Boolean] whether the key was set or not
|
642
643
|
def setnx(key, value)
|
643
644
|
synchronize do |client|
|
644
|
-
client.call
|
645
|
+
client.call([:setnx, key, value], &_boolify)
|
645
646
|
end
|
646
647
|
end
|
647
648
|
|
@@ -657,7 +658,7 @@ class Redis
|
|
657
658
|
# @see #mapped_mset
|
658
659
|
def mset(*args)
|
659
660
|
synchronize do |client|
|
660
|
-
client.call
|
661
|
+
client.call([:mset] + args)
|
661
662
|
end
|
662
663
|
end
|
663
664
|
|
@@ -672,7 +673,7 @@ class Redis
|
|
672
673
|
#
|
673
674
|
# @see #mset
|
674
675
|
def mapped_mset(hash)
|
675
|
-
mset(
|
676
|
+
mset(hash.to_a.flatten)
|
676
677
|
end
|
677
678
|
|
678
679
|
# Set one or more values, only if none of the keys exist.
|
@@ -687,7 +688,7 @@ class Redis
|
|
687
688
|
# @see #mapped_msetnx
|
688
689
|
def msetnx(*args)
|
689
690
|
synchronize do |client|
|
690
|
-
client.call
|
691
|
+
client.call([:msetnx] + args, &_boolify)
|
691
692
|
end
|
692
693
|
end
|
693
694
|
|
@@ -702,7 +703,7 @@ class Redis
|
|
702
703
|
#
|
703
704
|
# @see #msetnx
|
704
705
|
def mapped_msetnx(hash)
|
705
|
-
msetnx(
|
706
|
+
msetnx(hash.to_a.flatten)
|
706
707
|
end
|
707
708
|
|
708
709
|
# Get the value of a key.
|
@@ -711,7 +712,7 @@ class Redis
|
|
711
712
|
# @return [String]
|
712
713
|
def get(key)
|
713
714
|
synchronize do |client|
|
714
|
-
client.call
|
715
|
+
client.call([:get, key])
|
715
716
|
end
|
716
717
|
end
|
717
718
|
|
@@ -729,7 +730,7 @@ class Redis
|
|
729
730
|
# @see #mapped_mget
|
730
731
|
def mget(*keys, &blk)
|
731
732
|
synchronize do |client|
|
732
|
-
client.call
|
733
|
+
client.call([:mget] + keys, &blk)
|
733
734
|
end
|
734
735
|
end
|
735
736
|
|
@@ -746,11 +747,7 @@ class Redis
|
|
746
747
|
def mapped_mget(*keys)
|
747
748
|
mget(*keys) do |reply|
|
748
749
|
if reply.kind_of?(Array)
|
749
|
-
|
750
|
-
keys.zip(reply).each do |field, value|
|
751
|
-
hash[field] = value
|
752
|
-
end
|
753
|
-
hash
|
750
|
+
Hash[keys.zip(reply)]
|
754
751
|
else
|
755
752
|
reply
|
756
753
|
end
|
@@ -765,7 +762,7 @@ class Redis
|
|
765
762
|
# @return [Fixnum] length of the string after it was modified
|
766
763
|
def setrange(key, offset, value)
|
767
764
|
synchronize do |client|
|
768
|
-
client.call
|
765
|
+
client.call([:setrange, key, offset, value])
|
769
766
|
end
|
770
767
|
end
|
771
768
|
|
@@ -778,7 +775,7 @@ class Redis
|
|
778
775
|
# @return [Fixnum] `0` or `1`
|
779
776
|
def getrange(key, start, stop)
|
780
777
|
synchronize do |client|
|
781
|
-
client.call
|
778
|
+
client.call([:getrange, key, start, stop])
|
782
779
|
end
|
783
780
|
end
|
784
781
|
|
@@ -790,7 +787,7 @@ class Redis
|
|
790
787
|
# @return [Fixnum] the original bit value stored at `offset`
|
791
788
|
def setbit(key, offset, value)
|
792
789
|
synchronize do |client|
|
793
|
-
client.call
|
790
|
+
client.call([:setbit, key, offset, value])
|
794
791
|
end
|
795
792
|
end
|
796
793
|
|
@@ -801,7 +798,7 @@ class Redis
|
|
801
798
|
# @return [Fixnum] `0` or `1`
|
802
799
|
def getbit(key, offset)
|
803
800
|
synchronize do |client|
|
804
|
-
client.call
|
801
|
+
client.call([:getbit, key, offset])
|
805
802
|
end
|
806
803
|
end
|
807
804
|
|
@@ -812,7 +809,7 @@ class Redis
|
|
812
809
|
# @return [Fixnum] length of the string after appending
|
813
810
|
def append(key, value)
|
814
811
|
synchronize do |client|
|
815
|
-
client.call
|
812
|
+
client.call([:append, key, value])
|
816
813
|
end
|
817
814
|
end
|
818
815
|
|
@@ -824,7 +821,7 @@ class Redis
|
|
824
821
|
# did not exist
|
825
822
|
def getset(key, value)
|
826
823
|
synchronize do |client|
|
827
|
-
client.call
|
824
|
+
client.call([:getset, key, value])
|
828
825
|
end
|
829
826
|
end
|
830
827
|
|
@@ -835,7 +832,7 @@ class Redis
|
|
835
832
|
# if the key does not exist
|
836
833
|
def strlen(key)
|
837
834
|
synchronize do |client|
|
838
|
-
client.call
|
835
|
+
client.call([:strlen, key])
|
839
836
|
end
|
840
837
|
end
|
841
838
|
|
@@ -845,7 +842,7 @@ class Redis
|
|
845
842
|
# @return [Fixnum]
|
846
843
|
def llen(key)
|
847
844
|
synchronize do |client|
|
848
|
-
client.call
|
845
|
+
client.call([:llen, key])
|
849
846
|
end
|
850
847
|
end
|
851
848
|
|
@@ -856,7 +853,7 @@ class Redis
|
|
856
853
|
# @return [Fixnum] the length of the list after the push operation
|
857
854
|
def lpush(key, value)
|
858
855
|
synchronize do |client|
|
859
|
-
client.call
|
856
|
+
client.call([:lpush, key, value])
|
860
857
|
end
|
861
858
|
end
|
862
859
|
|
@@ -867,7 +864,7 @@ class Redis
|
|
867
864
|
# @return [Fixnum] the length of the list after the push operation
|
868
865
|
def lpushx(key, value)
|
869
866
|
synchronize do |client|
|
870
|
-
client.call
|
867
|
+
client.call([:lpushx, key, value])
|
871
868
|
end
|
872
869
|
end
|
873
870
|
|
@@ -878,7 +875,7 @@ class Redis
|
|
878
875
|
# @return [Fixnum] the length of the list after the push operation
|
879
876
|
def rpush(key, value)
|
880
877
|
synchronize do |client|
|
881
|
-
client.call
|
878
|
+
client.call([:rpush, key, value])
|
882
879
|
end
|
883
880
|
end
|
884
881
|
|
@@ -889,7 +886,7 @@ class Redis
|
|
889
886
|
# @return [Fixnum] the length of the list after the push operation
|
890
887
|
def rpushx(key, value)
|
891
888
|
synchronize do |client|
|
892
|
-
client.call
|
889
|
+
client.call([:rpushx, key, value])
|
893
890
|
end
|
894
891
|
end
|
895
892
|
|
@@ -899,7 +896,7 @@ class Redis
|
|
899
896
|
# @return [String]
|
900
897
|
def lpop(key)
|
901
898
|
synchronize do |client|
|
902
|
-
client.call
|
899
|
+
client.call([:lpop, key])
|
903
900
|
end
|
904
901
|
end
|
905
902
|
|
@@ -909,7 +906,7 @@ class Redis
|
|
909
906
|
# @return [String]
|
910
907
|
def rpop(key)
|
911
908
|
synchronize do |client|
|
912
|
-
client.call
|
909
|
+
client.call([:rpop, key])
|
913
910
|
end
|
914
911
|
end
|
915
912
|
|
@@ -920,7 +917,7 @@ class Redis
|
|
920
917
|
# @return [nil, String] the element, or nil when the source key does not exist
|
921
918
|
def rpoplpush(source, destination)
|
922
919
|
synchronize do |client|
|
923
|
-
client.call
|
920
|
+
client.call([:rpoplpush, source, destination])
|
924
921
|
end
|
925
922
|
end
|
926
923
|
|
@@ -943,7 +940,7 @@ class Redis
|
|
943
940
|
timeout = options[:timeout] || 0
|
944
941
|
|
945
942
|
synchronize do |client|
|
946
|
-
client.call_without_timeout
|
943
|
+
client.call_without_timeout([cmd, keys, timeout])
|
947
944
|
end
|
948
945
|
end
|
949
946
|
|
@@ -1009,7 +1006,7 @@ class Redis
|
|
1009
1006
|
timeout = options[:timeout] || 0
|
1010
1007
|
|
1011
1008
|
synchronize do |client|
|
1012
|
-
client.call_without_timeout
|
1009
|
+
client.call_without_timeout([:brpoplpush, source, destination, timeout])
|
1013
1010
|
end
|
1014
1011
|
end
|
1015
1012
|
|
@@ -1020,7 +1017,7 @@ class Redis
|
|
1020
1017
|
# @return [String]
|
1021
1018
|
def lindex(key, index)
|
1022
1019
|
synchronize do |client|
|
1023
|
-
client.call
|
1020
|
+
client.call([:lindex, key, index])
|
1024
1021
|
end
|
1025
1022
|
end
|
1026
1023
|
|
@@ -1034,7 +1031,7 @@ class Redis
|
|
1034
1031
|
# when the element `pivot` was not found
|
1035
1032
|
def linsert(key, where, pivot, value)
|
1036
1033
|
synchronize do |client|
|
1037
|
-
client.call
|
1034
|
+
client.call([:linsert, key, where, pivot, value])
|
1038
1035
|
end
|
1039
1036
|
end
|
1040
1037
|
|
@@ -1046,7 +1043,7 @@ class Redis
|
|
1046
1043
|
# @return [Array<String>]
|
1047
1044
|
def lrange(key, start, stop)
|
1048
1045
|
synchronize do |client|
|
1049
|
-
client.call
|
1046
|
+
client.call([:lrange, key, start, stop])
|
1050
1047
|
end
|
1051
1048
|
end
|
1052
1049
|
|
@@ -1061,7 +1058,7 @@ class Redis
|
|
1061
1058
|
# @return [Fixnum] the number of removed elements
|
1062
1059
|
def lrem(key, count, value)
|
1063
1060
|
synchronize do |client|
|
1064
|
-
client.call
|
1061
|
+
client.call([:lrem, key, count, value])
|
1065
1062
|
end
|
1066
1063
|
end
|
1067
1064
|
|
@@ -1073,7 +1070,7 @@ class Redis
|
|
1073
1070
|
# @return [String] `OK`
|
1074
1071
|
def lset(key, index, value)
|
1075
1072
|
synchronize do |client|
|
1076
|
-
client.call
|
1073
|
+
client.call([:lset, key, index, value])
|
1077
1074
|
end
|
1078
1075
|
end
|
1079
1076
|
|
@@ -1085,7 +1082,7 @@ class Redis
|
|
1085
1082
|
# @return [String] `OK`
|
1086
1083
|
def ltrim(key, start, stop)
|
1087
1084
|
synchronize do |client|
|
1088
|
-
client.call
|
1085
|
+
client.call([:ltrim, key, start, stop])
|
1089
1086
|
end
|
1090
1087
|
end
|
1091
1088
|
|
@@ -1095,7 +1092,7 @@ class Redis
|
|
1095
1092
|
# @return [Fixnum]
|
1096
1093
|
def scard(key)
|
1097
1094
|
synchronize do |client|
|
1098
|
-
client.call
|
1095
|
+
client.call([:scard, key])
|
1099
1096
|
end
|
1100
1097
|
end
|
1101
1098
|
|
@@ -1109,7 +1106,7 @@ class Redis
|
|
1109
1106
|
# successfully added
|
1110
1107
|
def sadd(key, member)
|
1111
1108
|
synchronize do |client|
|
1112
|
-
client.call
|
1109
|
+
client.call([:sadd, key, member]) do |reply|
|
1113
1110
|
if member.is_a? Array
|
1114
1111
|
# Variadic: return integer
|
1115
1112
|
reply
|
@@ -1131,7 +1128,7 @@ class Redis
|
|
1131
1128
|
# successfully removed
|
1132
1129
|
def srem(key, member)
|
1133
1130
|
synchronize do |client|
|
1134
|
-
client.call
|
1131
|
+
client.call([:srem, key, member]) do |reply|
|
1135
1132
|
if member.is_a? Array
|
1136
1133
|
# Variadic: return integer
|
1137
1134
|
reply
|
@@ -1149,7 +1146,7 @@ class Redis
|
|
1149
1146
|
# @return [String]
|
1150
1147
|
def spop(key)
|
1151
1148
|
synchronize do |client|
|
1152
|
-
client.call
|
1149
|
+
client.call([:spop, key])
|
1153
1150
|
end
|
1154
1151
|
end
|
1155
1152
|
|
@@ -1159,7 +1156,7 @@ class Redis
|
|
1159
1156
|
# @return [String]
|
1160
1157
|
def srandmember(key)
|
1161
1158
|
synchronize do |client|
|
1162
|
-
client.call
|
1159
|
+
client.call([:srandmember, key])
|
1163
1160
|
end
|
1164
1161
|
end
|
1165
1162
|
|
@@ -1171,7 +1168,7 @@ class Redis
|
|
1171
1168
|
# @return [Boolean]
|
1172
1169
|
def smove(source, destination, member)
|
1173
1170
|
synchronize do |client|
|
1174
|
-
client.call
|
1171
|
+
client.call([:smove, source, destination, member], &_boolify)
|
1175
1172
|
end
|
1176
1173
|
end
|
1177
1174
|
|
@@ -1182,7 +1179,7 @@ class Redis
|
|
1182
1179
|
# @return [Boolean]
|
1183
1180
|
def sismember(key, member)
|
1184
1181
|
synchronize do |client|
|
1185
|
-
client.call
|
1182
|
+
client.call([:sismember, key, member], &_boolify)
|
1186
1183
|
end
|
1187
1184
|
end
|
1188
1185
|
|
@@ -1192,7 +1189,7 @@ class Redis
|
|
1192
1189
|
# @return [Array<String>]
|
1193
1190
|
def smembers(key)
|
1194
1191
|
synchronize do |client|
|
1195
|
-
client.call
|
1192
|
+
client.call([:smembers, key])
|
1196
1193
|
end
|
1197
1194
|
end
|
1198
1195
|
|
@@ -1202,7 +1199,7 @@ class Redis
|
|
1202
1199
|
# @return [Array<String>] members in the difference
|
1203
1200
|
def sdiff(*keys)
|
1204
1201
|
synchronize do |client|
|
1205
|
-
client.call
|
1202
|
+
client.call([:sdiff] + keys)
|
1206
1203
|
end
|
1207
1204
|
end
|
1208
1205
|
|
@@ -1213,7 +1210,7 @@ class Redis
|
|
1213
1210
|
# @return [Fixnum] number of elements in the resulting set
|
1214
1211
|
def sdiffstore(destination, *keys)
|
1215
1212
|
synchronize do |client|
|
1216
|
-
client.call
|
1213
|
+
client.call([:sdiffstore, destination] + keys)
|
1217
1214
|
end
|
1218
1215
|
end
|
1219
1216
|
|
@@ -1223,7 +1220,7 @@ class Redis
|
|
1223
1220
|
# @return [Array<String>] members in the intersection
|
1224
1221
|
def sinter(*keys)
|
1225
1222
|
synchronize do |client|
|
1226
|
-
client.call
|
1223
|
+
client.call([:sinter] + keys)
|
1227
1224
|
end
|
1228
1225
|
end
|
1229
1226
|
|
@@ -1234,7 +1231,7 @@ class Redis
|
|
1234
1231
|
# @return [Fixnum] number of elements in the resulting set
|
1235
1232
|
def sinterstore(destination, *keys)
|
1236
1233
|
synchronize do |client|
|
1237
|
-
client.call
|
1234
|
+
client.call([:sinterstore, destination] + keys)
|
1238
1235
|
end
|
1239
1236
|
end
|
1240
1237
|
|
@@ -1244,7 +1241,7 @@ class Redis
|
|
1244
1241
|
# @return [Array<String>] members in the union
|
1245
1242
|
def sunion(*keys)
|
1246
1243
|
synchronize do |client|
|
1247
|
-
client.call
|
1244
|
+
client.call([:sunion] + keys)
|
1248
1245
|
end
|
1249
1246
|
end
|
1250
1247
|
|
@@ -1255,7 +1252,7 @@ class Redis
|
|
1255
1252
|
# @return [Fixnum] number of elements in the resulting set
|
1256
1253
|
def sunionstore(destination, *keys)
|
1257
1254
|
synchronize do |client|
|
1258
|
-
client.call
|
1255
|
+
client.call([:sunionstore, destination] + keys)
|
1259
1256
|
end
|
1260
1257
|
end
|
1261
1258
|
|
@@ -1269,7 +1266,7 @@ class Redis
|
|
1269
1266
|
# @return [Fixnum]
|
1270
1267
|
def zcard(key)
|
1271
1268
|
synchronize do |client|
|
1272
|
-
client.call
|
1269
|
+
client.call([:zcard, key])
|
1273
1270
|
end
|
1274
1271
|
end
|
1275
1272
|
|
@@ -1295,10 +1292,10 @@ class Redis
|
|
1295
1292
|
synchronize do |client|
|
1296
1293
|
if args.size == 1 && args[0].is_a?(Array)
|
1297
1294
|
# Variadic: return integer
|
1298
|
-
client.call
|
1295
|
+
client.call([:zadd, key] + args[0])
|
1299
1296
|
elsif args.size == 2
|
1300
1297
|
# Single pair: return boolean
|
1301
|
-
client.call
|
1298
|
+
client.call([:zadd, key, args[0], args[1]], &_boolify)
|
1302
1299
|
else
|
1303
1300
|
raise ArgumentError, "wrong number of arguments"
|
1304
1301
|
end
|
@@ -1317,8 +1314,8 @@ class Redis
|
|
1317
1314
|
# @return [Float] score of the member after incrementing it
|
1318
1315
|
def zincrby(key, increment, member)
|
1319
1316
|
synchronize do |client|
|
1320
|
-
client.call
|
1321
|
-
|
1317
|
+
client.call([:zincrby, key, increment, member]) do |reply|
|
1318
|
+
_floatify(reply) if reply
|
1322
1319
|
end
|
1323
1320
|
end
|
1324
1321
|
end
|
@@ -1342,7 +1339,7 @@ class Redis
|
|
1342
1339
|
# members that were removed to the sorted set
|
1343
1340
|
def zrem(key, member)
|
1344
1341
|
synchronize do |client|
|
1345
|
-
client.call
|
1342
|
+
client.call([:zrem, key, member]) do |reply|
|
1346
1343
|
if member.is_a? Array
|
1347
1344
|
# Variadic: return integer
|
1348
1345
|
reply
|
@@ -1365,8 +1362,8 @@ class Redis
|
|
1365
1362
|
# @return [Float] score of the member
|
1366
1363
|
def zscore(key, member)
|
1367
1364
|
synchronize do |client|
|
1368
|
-
client.call
|
1369
|
-
|
1365
|
+
client.call([:zscore, key, member]) do |reply|
|
1366
|
+
_floatify(reply) if reply
|
1370
1367
|
end
|
1371
1368
|
end
|
1372
1369
|
end
|
@@ -1396,11 +1393,11 @@ class Redis
|
|
1396
1393
|
args << "WITHSCORES" if with_scores
|
1397
1394
|
|
1398
1395
|
synchronize do |client|
|
1399
|
-
client.call
|
1396
|
+
client.call([:zrange, key, start, stop] + args) do |reply|
|
1400
1397
|
if with_scores
|
1401
1398
|
if reply
|
1402
1399
|
reply.each_slice(2).map do |member, score|
|
1403
|
-
[member,
|
1400
|
+
[member, _floatify(score)]
|
1404
1401
|
end
|
1405
1402
|
end
|
1406
1403
|
else
|
@@ -1428,11 +1425,11 @@ class Redis
|
|
1428
1425
|
args << "WITHSCORES" if with_scores
|
1429
1426
|
|
1430
1427
|
synchronize do |client|
|
1431
|
-
client.call
|
1428
|
+
client.call([:zrevrange, key, start, stop] + args) do |reply|
|
1432
1429
|
if with_scores
|
1433
1430
|
if reply
|
1434
1431
|
reply.each_slice(2).map do |member, score|
|
1435
|
-
[member,
|
1432
|
+
[member, _floatify(score)]
|
1436
1433
|
end
|
1437
1434
|
end
|
1438
1435
|
else
|
@@ -1449,7 +1446,7 @@ class Redis
|
|
1449
1446
|
# @return [Fixnum]
|
1450
1447
|
def zrank(key, member)
|
1451
1448
|
synchronize do |client|
|
1452
|
-
client.call
|
1449
|
+
client.call([:zrank, key, member])
|
1453
1450
|
end
|
1454
1451
|
end
|
1455
1452
|
|
@@ -1461,7 +1458,7 @@ class Redis
|
|
1461
1458
|
# @return [Fixnum]
|
1462
1459
|
def zrevrank(key, member)
|
1463
1460
|
synchronize do |client|
|
1464
|
-
client.call
|
1461
|
+
client.call([:zrevrank, key, member])
|
1465
1462
|
end
|
1466
1463
|
end
|
1467
1464
|
|
@@ -1480,7 +1477,7 @@ class Redis
|
|
1480
1477
|
# @return [Fixnum] number of members that were removed
|
1481
1478
|
def zremrangebyrank(key, start, stop)
|
1482
1479
|
synchronize do |client|
|
1483
|
-
client.call
|
1480
|
+
client.call([:zremrangebyrank, key, start, stop])
|
1484
1481
|
end
|
1485
1482
|
end
|
1486
1483
|
|
@@ -1515,17 +1512,17 @@ class Redis
|
|
1515
1512
|
args = []
|
1516
1513
|
|
1517
1514
|
with_scores = options[:with_scores] || options[:withscores]
|
1518
|
-
args.concat
|
1515
|
+
args.concat(["WITHSCORES"]) if with_scores
|
1519
1516
|
|
1520
1517
|
limit = options[:limit]
|
1521
|
-
args.concat
|
1518
|
+
args.concat(["LIMIT"] + limit) if limit
|
1522
1519
|
|
1523
1520
|
synchronize do |client|
|
1524
|
-
client.call
|
1521
|
+
client.call([:zrangebyscore, key, min, max] + args) do |reply|
|
1525
1522
|
if with_scores
|
1526
1523
|
if reply
|
1527
1524
|
reply.each_slice(2).map do |member, score|
|
1528
|
-
[member,
|
1525
|
+
[member, _floatify(score)]
|
1529
1526
|
end
|
1530
1527
|
end
|
1531
1528
|
else
|
@@ -1553,17 +1550,17 @@ class Redis
|
|
1553
1550
|
args = []
|
1554
1551
|
|
1555
1552
|
with_scores = options[:with_scores] || options[:withscores]
|
1556
|
-
args.concat
|
1553
|
+
args.concat(["WITHSCORES"]) if with_scores
|
1557
1554
|
|
1558
1555
|
limit = options[:limit]
|
1559
|
-
args.concat
|
1556
|
+
args.concat(["LIMIT"] + limit) if limit
|
1560
1557
|
|
1561
1558
|
synchronize do |client|
|
1562
|
-
client.call
|
1559
|
+
client.call([:zrevrangebyscore, key, max, min] + args) do |reply|
|
1563
1560
|
if with_scores
|
1564
1561
|
if reply
|
1565
1562
|
reply.each_slice(2).map do |member, score|
|
1566
|
-
[member,
|
1563
|
+
[member, _floatify(score)]
|
1567
1564
|
end
|
1568
1565
|
end
|
1569
1566
|
else
|
@@ -1592,7 +1589,7 @@ class Redis
|
|
1592
1589
|
# @return [Fixnum] number of members that were removed
|
1593
1590
|
def zremrangebyscore(key, min, max)
|
1594
1591
|
synchronize do |client|
|
1595
|
-
client.call
|
1592
|
+
client.call([:zremrangebyscore, key, min, max])
|
1596
1593
|
end
|
1597
1594
|
end
|
1598
1595
|
|
@@ -1615,7 +1612,7 @@ class Redis
|
|
1615
1612
|
# @return [Fixnum] number of members in within the specified range
|
1616
1613
|
def zcount(key, min, max)
|
1617
1614
|
synchronize do |client|
|
1618
|
-
client.call
|
1615
|
+
client.call([:zcount, key, min, max])
|
1619
1616
|
end
|
1620
1617
|
end
|
1621
1618
|
|
@@ -1637,13 +1634,13 @@ class Redis
|
|
1637
1634
|
args = []
|
1638
1635
|
|
1639
1636
|
weights = options[:weights]
|
1640
|
-
args.concat
|
1637
|
+
args.concat(["WEIGHTS"] + weights) if weights
|
1641
1638
|
|
1642
1639
|
aggregate = options[:aggregate]
|
1643
|
-
args.concat
|
1640
|
+
args.concat(["AGGREGATE", aggregate]) if aggregate
|
1644
1641
|
|
1645
1642
|
synchronize do |client|
|
1646
|
-
client.call
|
1643
|
+
client.call([:zinterstore, destination, keys.size] + keys + args)
|
1647
1644
|
end
|
1648
1645
|
end
|
1649
1646
|
|
@@ -1664,13 +1661,13 @@ class Redis
|
|
1664
1661
|
args = []
|
1665
1662
|
|
1666
1663
|
weights = options[:weights]
|
1667
|
-
args.concat
|
1664
|
+
args.concat(["WEIGHTS"] + weights) if weights
|
1668
1665
|
|
1669
1666
|
aggregate = options[:aggregate]
|
1670
|
-
args.concat
|
1667
|
+
args.concat(["AGGREGATE", aggregate]) if aggregate
|
1671
1668
|
|
1672
1669
|
synchronize do |client|
|
1673
|
-
client.call
|
1670
|
+
client.call([:zunionstore, destination, keys.size] + keys + args)
|
1674
1671
|
end
|
1675
1672
|
end
|
1676
1673
|
|
@@ -1680,7 +1677,7 @@ class Redis
|
|
1680
1677
|
# @return [Fixnum] number of fields in the hash
|
1681
1678
|
def hlen(key)
|
1682
1679
|
synchronize do |client|
|
1683
|
-
client.call
|
1680
|
+
client.call([:hlen, key])
|
1684
1681
|
end
|
1685
1682
|
end
|
1686
1683
|
|
@@ -1692,7 +1689,7 @@ class Redis
|
|
1692
1689
|
# @return [Boolean] whether or not the field was **added** to the hash
|
1693
1690
|
def hset(key, field, value)
|
1694
1691
|
synchronize do |client|
|
1695
|
-
client.call
|
1692
|
+
client.call([:hset, key, field, value], &_boolify)
|
1696
1693
|
end
|
1697
1694
|
end
|
1698
1695
|
|
@@ -1704,7 +1701,7 @@ class Redis
|
|
1704
1701
|
# @return [Boolean] whether or not the field was **added** to the hash
|
1705
1702
|
def hsetnx(key, field, value)
|
1706
1703
|
synchronize do |client|
|
1707
|
-
client.call
|
1704
|
+
client.call([:hsetnx, key, field, value], &_boolify)
|
1708
1705
|
end
|
1709
1706
|
end
|
1710
1707
|
|
@@ -1721,7 +1718,7 @@ class Redis
|
|
1721
1718
|
# @see #mapped_hmset
|
1722
1719
|
def hmset(key, *attrs)
|
1723
1720
|
synchronize do |client|
|
1724
|
-
client.call
|
1721
|
+
client.call([:hmset, key] + attrs)
|
1725
1722
|
end
|
1726
1723
|
end
|
1727
1724
|
|
@@ -1737,7 +1734,7 @@ class Redis
|
|
1737
1734
|
#
|
1738
1735
|
# @see #hmset
|
1739
1736
|
def mapped_hmset(key, hash)
|
1740
|
-
hmset(key,
|
1737
|
+
hmset(key, hash.to_a.flatten)
|
1741
1738
|
end
|
1742
1739
|
|
1743
1740
|
# Get the value of a hash field.
|
@@ -1747,7 +1744,7 @@ class Redis
|
|
1747
1744
|
# @return [String]
|
1748
1745
|
def hget(key, field)
|
1749
1746
|
synchronize do |client|
|
1750
|
-
client.call
|
1747
|
+
client.call([:hget, key, field])
|
1751
1748
|
end
|
1752
1749
|
end
|
1753
1750
|
|
@@ -1764,7 +1761,7 @@ class Redis
|
|
1764
1761
|
# @see #mapped_hmget
|
1765
1762
|
def hmget(key, *fields, &blk)
|
1766
1763
|
synchronize do |client|
|
1767
|
-
client.call
|
1764
|
+
client.call([:hmget, key] + fields, &blk)
|
1768
1765
|
end
|
1769
1766
|
end
|
1770
1767
|
|
@@ -1782,11 +1779,7 @@ class Redis
|
|
1782
1779
|
def mapped_hmget(key, *fields)
|
1783
1780
|
hmget(key, *fields) do |reply|
|
1784
1781
|
if reply.kind_of?(Array)
|
1785
|
-
|
1786
|
-
fields.zip(reply).each do |field, value|
|
1787
|
-
hash[field] = value
|
1788
|
-
end
|
1789
|
-
hash
|
1782
|
+
Hash[fields.zip(reply)]
|
1790
1783
|
else
|
1791
1784
|
reply
|
1792
1785
|
end
|
@@ -1800,7 +1793,7 @@ class Redis
|
|
1800
1793
|
# @return [Fixnum] the number of fields that were removed from the hash
|
1801
1794
|
def hdel(key, field)
|
1802
1795
|
synchronize do |client|
|
1803
|
-
client.call
|
1796
|
+
client.call([:hdel, key, field])
|
1804
1797
|
end
|
1805
1798
|
end
|
1806
1799
|
|
@@ -1811,7 +1804,7 @@ class Redis
|
|
1811
1804
|
# @return [Boolean] whether or not the field exists in the hash
|
1812
1805
|
def hexists(key, field)
|
1813
1806
|
synchronize do |client|
|
1814
|
-
client.call
|
1807
|
+
client.call([:hexists, key, field], &_boolify)
|
1815
1808
|
end
|
1816
1809
|
end
|
1817
1810
|
|
@@ -1823,7 +1816,7 @@ class Redis
|
|
1823
1816
|
# @return [Fixnum] value of the field after incrementing it
|
1824
1817
|
def hincrby(key, field, increment)
|
1825
1818
|
synchronize do |client|
|
1826
|
-
client.call
|
1819
|
+
client.call([:hincrby, key, field, increment])
|
1827
1820
|
end
|
1828
1821
|
end
|
1829
1822
|
|
@@ -1835,8 +1828,8 @@ class Redis
|
|
1835
1828
|
# @return [Float] value of the field after incrementing it
|
1836
1829
|
def hincrbyfloat(key, field, increment)
|
1837
1830
|
synchronize do |client|
|
1838
|
-
client.call
|
1839
|
-
|
1831
|
+
client.call([:hincrbyfloat, key, field, increment]) do |reply|
|
1832
|
+
_floatify(reply) if reply
|
1840
1833
|
end
|
1841
1834
|
end
|
1842
1835
|
end
|
@@ -1847,7 +1840,7 @@ class Redis
|
|
1847
1840
|
# @return [Array<String>]
|
1848
1841
|
def hkeys(key)
|
1849
1842
|
synchronize do |client|
|
1850
|
-
client.call
|
1843
|
+
client.call([:hkeys, key])
|
1851
1844
|
end
|
1852
1845
|
end
|
1853
1846
|
|
@@ -1857,7 +1850,7 @@ class Redis
|
|
1857
1850
|
# @return [Array<String>]
|
1858
1851
|
def hvals(key)
|
1859
1852
|
synchronize do |client|
|
1860
|
-
client.call
|
1853
|
+
client.call([:hvals, key])
|
1861
1854
|
end
|
1862
1855
|
end
|
1863
1856
|
|
@@ -1867,14 +1860,14 @@ class Redis
|
|
1867
1860
|
# @return [Hash<String, String>]
|
1868
1861
|
def hgetall(key)
|
1869
1862
|
synchronize do |client|
|
1870
|
-
client.call
|
1863
|
+
client.call([:hgetall, key], &_hashify)
|
1871
1864
|
end
|
1872
1865
|
end
|
1873
1866
|
|
1874
1867
|
# Post a message to a channel.
|
1875
1868
|
def publish(channel, message)
|
1876
1869
|
synchronize do |client|
|
1877
|
-
client.call
|
1870
|
+
client.call([:publish, channel, message])
|
1878
1871
|
end
|
1879
1872
|
end
|
1880
1873
|
|
@@ -1946,11 +1939,11 @@ class Redis
|
|
1946
1939
|
# @see #multi
|
1947
1940
|
def watch(*keys)
|
1948
1941
|
synchronize do |client|
|
1949
|
-
client.call
|
1942
|
+
client.call([:watch] + keys)
|
1950
1943
|
|
1951
1944
|
if block_given?
|
1952
1945
|
begin
|
1953
|
-
yield
|
1946
|
+
yield(self)
|
1954
1947
|
rescue ConnectionError
|
1955
1948
|
raise
|
1956
1949
|
rescue StandardError
|
@@ -1969,7 +1962,7 @@ class Redis
|
|
1969
1962
|
# @see #multi
|
1970
1963
|
def unwatch
|
1971
1964
|
synchronize do |client|
|
1972
|
-
client.call
|
1965
|
+
client.call([:unwatch])
|
1973
1966
|
end
|
1974
1967
|
end
|
1975
1968
|
|
@@ -2018,7 +2011,7 @@ class Redis
|
|
2018
2011
|
def multi
|
2019
2012
|
synchronize do |client|
|
2020
2013
|
if !block_given?
|
2021
|
-
client.call
|
2014
|
+
client.call([:multi])
|
2022
2015
|
else
|
2023
2016
|
begin
|
2024
2017
|
pipeline = Pipeline::Multi.new
|
@@ -2044,7 +2037,7 @@ class Redis
|
|
2044
2037
|
# @see #discard
|
2045
2038
|
def exec
|
2046
2039
|
synchronize do |client|
|
2047
|
-
client.call
|
2040
|
+
client.call([:exec])
|
2048
2041
|
end
|
2049
2042
|
end
|
2050
2043
|
|
@@ -2058,7 +2051,7 @@ class Redis
|
|
2058
2051
|
# @see #exec
|
2059
2052
|
def discard
|
2060
2053
|
synchronize do |client|
|
2061
|
-
client.call
|
2054
|
+
client.call([:discard])
|
2062
2055
|
end
|
2063
2056
|
end
|
2064
2057
|
|
@@ -2093,7 +2086,7 @@ class Redis
|
|
2093
2086
|
synchronize do |client|
|
2094
2087
|
arg = args.first
|
2095
2088
|
|
2096
|
-
client.call
|
2089
|
+
client.call([:script, :exists, arg]) do |reply|
|
2097
2090
|
reply = reply.map { |r| _boolify.call(r) }
|
2098
2091
|
|
2099
2092
|
if arg.is_a?(Array)
|
@@ -2105,7 +2098,7 @@ class Redis
|
|
2105
2098
|
end
|
2106
2099
|
else
|
2107
2100
|
synchronize do |client|
|
2108
|
-
client.call
|
2101
|
+
client.call([:script, subcommand] + args)
|
2109
2102
|
end
|
2110
2103
|
end
|
2111
2104
|
end
|
@@ -2119,7 +2112,7 @@ class Redis
|
|
2119
2112
|
argv = args.shift || options[:argv] || []
|
2120
2113
|
|
2121
2114
|
synchronize do |client|
|
2122
|
-
client.call
|
2115
|
+
client.call([cmd, script, keys.length] + keys + argv)
|
2123
2116
|
end
|
2124
2117
|
end
|
2125
2118
|
|
@@ -2187,7 +2180,7 @@ class Redis
|
|
2187
2180
|
|
2188
2181
|
def method_missing(command, *args)
|
2189
2182
|
synchronize do |client|
|
2190
|
-
client.call
|
2183
|
+
client.call([command] + args)
|
2191
2184
|
end
|
2192
2185
|
end
|
2193
2186
|
|
@@ -2212,8 +2205,16 @@ private
|
|
2212
2205
|
}
|
2213
2206
|
end
|
2214
2207
|
|
2208
|
+
def _floatify(str)
|
2209
|
+
if (inf = str.match(/^(-)?inf/i))
|
2210
|
+
(inf[1] ? -1.0 : 1.0) / 0.0
|
2211
|
+
else
|
2212
|
+
Float str
|
2213
|
+
end
|
2214
|
+
end
|
2215
|
+
|
2215
2216
|
def _subscription(method, channels, block)
|
2216
|
-
return @client.call
|
2217
|
+
return @client.call([method] + channels) if subscribed?
|
2217
2218
|
|
2218
2219
|
begin
|
2219
2220
|
original, @client = @client, SubscribedClient.new(@client)
|