redis 3.0.0.rc2 → 3.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.
- data/.order +169 -0
- data/CHANGELOG.md +79 -9
- data/README.md +7 -0
- data/Rakefile +167 -0
- data/lib/redis.rb +1265 -1148
- data/lib/redis/client.rb +11 -18
- data/lib/redis/distributed.rb +337 -280
- data/lib/redis/pipeline.rb +12 -4
- data/lib/redis/version.rb +1 -1
- data/redis.gemspec +1 -1
- data/test/commands_on_lists_test.rb +0 -30
- data/test/commands_on_strings_test.rb +0 -6
- data/test/distributed_scripting_test.rb +102 -0
- data/test/internals_test.rb +33 -35
- data/test/lint/lists.rb +42 -12
- data/test/lint/strings.rb +6 -0
- data/test/lint/value_types.rb +10 -6
- data/test/scripting_test.rb +78 -0
- metadata +12 -8
data/lib/redis/client.rb
CHANGED
@@ -110,26 +110,15 @@ class Redis
|
|
110
110
|
end
|
111
111
|
|
112
112
|
def call_pipeline(pipeline)
|
113
|
-
|
114
|
-
without_reconnect_wrapper = lambda do |&blk|
|
115
|
-
without_reconnect(&blk)
|
116
|
-
end if pipeline.without_reconnect?
|
117
|
-
|
118
|
-
shutdown_wrapper = lambda do |&blk| blk.call end
|
119
|
-
shutdown_wrapper = lambda do |&blk|
|
113
|
+
with_reconnect pipeline.with_reconnect? do
|
120
114
|
begin
|
121
|
-
|
122
|
-
rescue ConnectionError
|
115
|
+
pipeline.finish(call_pipelined(pipeline.commands))
|
116
|
+
rescue ConnectionError => e
|
117
|
+
return nil if pipeline.shutdown?
|
123
118
|
# Assume the pipeline was sent in one piece, but execution of
|
124
119
|
# SHUTDOWN caused none of the replies for commands that were executed
|
125
120
|
# prior to it from coming back around.
|
126
|
-
|
127
|
-
end
|
128
|
-
end if pipeline.shutdown?
|
129
|
-
|
130
|
-
without_reconnect_wrapper.call do
|
131
|
-
shutdown_wrapper.call do
|
132
|
-
pipeline.finish(call_pipelined(pipeline.commands))
|
121
|
+
raise e
|
133
122
|
end
|
134
123
|
end
|
135
124
|
end
|
@@ -234,15 +223,19 @@ class Redis
|
|
234
223
|
end
|
235
224
|
end
|
236
225
|
|
237
|
-
def
|
226
|
+
def with_reconnect(val=true)
|
238
227
|
begin
|
239
|
-
original, @reconnect = @reconnect,
|
228
|
+
original, @reconnect = @reconnect, val
|
240
229
|
yield
|
241
230
|
ensure
|
242
231
|
@reconnect = original
|
243
232
|
end
|
244
233
|
end
|
245
234
|
|
235
|
+
def without_reconnect(&blk)
|
236
|
+
with_reconnect(false, &blk)
|
237
|
+
end
|
238
|
+
|
246
239
|
protected
|
247
240
|
|
248
241
|
def logging(commands)
|
data/lib/redis/distributed.rb
CHANGED
@@ -34,11 +34,6 @@ class Redis
|
|
34
34
|
@ring.add_node Redis.new(@default_options.merge(:url => url))
|
35
35
|
end
|
36
36
|
|
37
|
-
# Close the connection.
|
38
|
-
def quit
|
39
|
-
on_each_node :quit
|
40
|
-
end
|
41
|
-
|
42
37
|
# Change the selected database for the current connection.
|
43
38
|
def select(db)
|
44
39
|
on_each_node :select, db
|
@@ -49,14 +44,94 @@ class Redis
|
|
49
44
|
on_each_node :ping
|
50
45
|
end
|
51
46
|
|
47
|
+
# Echo the given string.
|
48
|
+
def echo(value)
|
49
|
+
on_each_node :echo, value
|
50
|
+
end
|
51
|
+
|
52
|
+
# Close the connection.
|
53
|
+
def quit
|
54
|
+
on_each_node :quit
|
55
|
+
end
|
56
|
+
|
57
|
+
# Asynchronously save the dataset to disk.
|
58
|
+
def bgsave
|
59
|
+
on_each_node :bgsave
|
60
|
+
end
|
61
|
+
|
62
|
+
# Return the number of keys in the selected database.
|
63
|
+
def dbsize
|
64
|
+
on_each_node :dbsize
|
65
|
+
end
|
66
|
+
|
52
67
|
# Remove all keys from all databases.
|
53
68
|
def flushall
|
54
69
|
on_each_node :flushall
|
55
70
|
end
|
56
71
|
|
57
|
-
#
|
58
|
-
def
|
59
|
-
|
72
|
+
# Remove all keys from the current database.
|
73
|
+
def flushdb
|
74
|
+
on_each_node :flushdb
|
75
|
+
end
|
76
|
+
|
77
|
+
# Get information and statistics about the server.
|
78
|
+
def info(cmd = nil)
|
79
|
+
on_each_node :info, cmd
|
80
|
+
end
|
81
|
+
|
82
|
+
# Get the UNIX time stamp of the last successful save to disk.
|
83
|
+
def lastsave
|
84
|
+
on_each_node :lastsave
|
85
|
+
end
|
86
|
+
|
87
|
+
# Listen for all requests received by the server in real time.
|
88
|
+
def monitor
|
89
|
+
raise NotImplementedError
|
90
|
+
end
|
91
|
+
|
92
|
+
# Synchronously save the dataset to disk.
|
93
|
+
def save
|
94
|
+
on_each_node :save
|
95
|
+
end
|
96
|
+
|
97
|
+
# Get server time: an UNIX timestamp and the elapsed microseconds in the current second.
|
98
|
+
def time
|
99
|
+
on_each_node :time
|
100
|
+
end
|
101
|
+
|
102
|
+
# Remove the expiration from a key.
|
103
|
+
def persist(key)
|
104
|
+
node_for(key).persist(key)
|
105
|
+
end
|
106
|
+
|
107
|
+
# Set a key's time to live in seconds.
|
108
|
+
def expire(key, seconds)
|
109
|
+
node_for(key).expire(key, seconds)
|
110
|
+
end
|
111
|
+
|
112
|
+
# Set the expiration for a key as a UNIX timestamp.
|
113
|
+
def expireat(key, unix_time)
|
114
|
+
node_for(key).expireat(key, unix_time)
|
115
|
+
end
|
116
|
+
|
117
|
+
# Get the time to live (in seconds) for a key.
|
118
|
+
def ttl(key)
|
119
|
+
node_for(key).ttl(key)
|
120
|
+
end
|
121
|
+
|
122
|
+
# Set a key's time to live in milliseconds.
|
123
|
+
def pexpire(key, milliseconds)
|
124
|
+
node_for(key).pexpire(key, milliseconds)
|
125
|
+
end
|
126
|
+
|
127
|
+
# Set the expiration for a key as number of milliseconds from UNIX Epoch.
|
128
|
+
def pexpireat(key, ms_unix_time)
|
129
|
+
node_for(key).pexpireat(key, ms_unix_time)
|
130
|
+
end
|
131
|
+
|
132
|
+
# Get the time to live (in milliseconds) for a key.
|
133
|
+
def pttl(key)
|
134
|
+
node_for(key).pttl(key)
|
60
135
|
end
|
61
136
|
|
62
137
|
# Delete a key.
|
@@ -67,9 +142,9 @@ class Redis
|
|
67
142
|
end
|
68
143
|
end
|
69
144
|
|
70
|
-
# Determine
|
71
|
-
def
|
72
|
-
node_for(key).
|
145
|
+
# Determine if a key exists.
|
146
|
+
def exists(key)
|
147
|
+
node_for(key).exists(key)
|
73
148
|
end
|
74
149
|
|
75
150
|
# Find all keys matching the given pattern.
|
@@ -77,6 +152,11 @@ class Redis
|
|
77
152
|
on_each_node(:keys, glob).flatten
|
78
153
|
end
|
79
154
|
|
155
|
+
# Move a key to another database.
|
156
|
+
def move(key, db)
|
157
|
+
node_for(key).move(key, db)
|
158
|
+
end
|
159
|
+
|
80
160
|
# Return a random key from the keyspace.
|
81
161
|
def randomkey
|
82
162
|
raise CannotDistribute, :randomkey
|
@@ -96,54 +176,43 @@ class Redis
|
|
96
176
|
end
|
97
177
|
end
|
98
178
|
|
99
|
-
#
|
100
|
-
def
|
101
|
-
|
102
|
-
end
|
103
|
-
|
104
|
-
# Set a key's time to live in seconds.
|
105
|
-
def expire(key, seconds)
|
106
|
-
node_for(key).expire(key, seconds)
|
107
|
-
end
|
108
|
-
|
109
|
-
# Set a key's time to live in milliseconds.
|
110
|
-
def pexpire(key, milliseconds)
|
111
|
-
node_for(key).pexpire(key, milliseconds)
|
112
|
-
end
|
179
|
+
# Sort the elements in a list, set or sorted set.
|
180
|
+
def sort(key, options = {})
|
181
|
+
keys = [key, options[:by], options[:store], *Array(options[:get])].compact
|
113
182
|
|
114
|
-
|
115
|
-
|
116
|
-
|
183
|
+
ensure_same_node(:sort, keys) do |node|
|
184
|
+
node.sort(key, options)
|
185
|
+
end
|
117
186
|
end
|
118
187
|
|
119
|
-
#
|
120
|
-
def
|
121
|
-
node_for(key).
|
188
|
+
# Determine the type stored at key.
|
189
|
+
def type(key)
|
190
|
+
node_for(key).type(key)
|
122
191
|
end
|
123
192
|
|
124
|
-
#
|
125
|
-
def
|
126
|
-
node_for(key).
|
193
|
+
# Decrement the integer value of a key by one.
|
194
|
+
def decr(key)
|
195
|
+
node_for(key).decr(key)
|
127
196
|
end
|
128
197
|
|
129
|
-
#
|
130
|
-
def
|
131
|
-
node_for(key).
|
198
|
+
# Decrement the integer value of a key by the given number.
|
199
|
+
def decrby(key, decrement)
|
200
|
+
node_for(key).decrby(key, decrement)
|
132
201
|
end
|
133
202
|
|
134
|
-
#
|
135
|
-
def
|
136
|
-
node_for(key).
|
203
|
+
# Increment the integer value of a key by one.
|
204
|
+
def incr(key)
|
205
|
+
node_for(key).incr(key)
|
137
206
|
end
|
138
207
|
|
139
|
-
#
|
140
|
-
def
|
141
|
-
node_for(key).
|
208
|
+
# Increment the integer value of a key by the given integer number.
|
209
|
+
def incrby(key, increment)
|
210
|
+
node_for(key).incrby(key, increment)
|
142
211
|
end
|
143
212
|
|
144
|
-
#
|
145
|
-
def
|
146
|
-
|
213
|
+
# Increment the numeric value of a key by the given float number.
|
214
|
+
def incrbyfloat(key, increment)
|
215
|
+
node_for(key).incrbyfloat(key, increment)
|
147
216
|
end
|
148
217
|
|
149
218
|
# Set the string value of a key.
|
@@ -151,16 +220,6 @@ class Redis
|
|
151
220
|
node_for(key).set(key, value)
|
152
221
|
end
|
153
222
|
|
154
|
-
# Sets or clears the bit at offset in the string value stored at key.
|
155
|
-
def setbit(key, offset, value)
|
156
|
-
node_for(key).setbit(key, offset, value)
|
157
|
-
end
|
158
|
-
|
159
|
-
# Overwrite part of a string at key starting at the specified offset.
|
160
|
-
def setrange(key, offset, value)
|
161
|
-
node_for(key).setrange(key, offset, value)
|
162
|
-
end
|
163
|
-
|
164
223
|
# Set the time to live in seconds of a key.
|
165
224
|
def setex(key, ttl, value)
|
166
225
|
node_for(key).setex(key, ttl, value)
|
@@ -171,37 +230,32 @@ class Redis
|
|
171
230
|
node_for(key).psetex(key, ttl, value)
|
172
231
|
end
|
173
232
|
|
174
|
-
#
|
175
|
-
def
|
176
|
-
node_for(key).
|
177
|
-
end
|
178
|
-
|
179
|
-
# Returns the bit value at offset in the string value stored at key.
|
180
|
-
def getbit(key, offset)
|
181
|
-
node_for(key).getbit(key, offset)
|
233
|
+
# Set the value of a key, only if the key does not exist.
|
234
|
+
def setnx(key, value)
|
235
|
+
node_for(key).setnx(key, value)
|
182
236
|
end
|
183
237
|
|
184
|
-
#
|
185
|
-
def
|
186
|
-
|
238
|
+
# Set multiple keys to multiple values.
|
239
|
+
def mset(*args)
|
240
|
+
raise CannotDistribute, :mset
|
187
241
|
end
|
188
242
|
|
189
|
-
|
190
|
-
|
191
|
-
node_for(key).getset(key, value)
|
243
|
+
def mapped_mset(hash)
|
244
|
+
raise CannotDistribute, :mapped_mset
|
192
245
|
end
|
193
246
|
|
194
|
-
|
195
|
-
|
247
|
+
# Set multiple keys to multiple values, only if none of the keys exist.
|
248
|
+
def msetnx(*args)
|
249
|
+
raise CannotDistribute, :msetnx
|
196
250
|
end
|
197
251
|
|
198
|
-
|
199
|
-
|
200
|
-
node_for(key).append(key, value)
|
252
|
+
def mapped_msetnx(hash)
|
253
|
+
raise CannotDistribute, :mapped_msetnx
|
201
254
|
end
|
202
255
|
|
203
|
-
|
204
|
-
|
256
|
+
# Get the value of a key.
|
257
|
+
def get(key)
|
258
|
+
node_for(key).get(key)
|
205
259
|
end
|
206
260
|
|
207
261
|
# Get the values of all the given keys.
|
@@ -213,62 +267,47 @@ class Redis
|
|
213
267
|
raise CannotDistribute, :mapped_mget
|
214
268
|
end
|
215
269
|
|
216
|
-
#
|
217
|
-
def
|
218
|
-
node_for(key).
|
219
|
-
end
|
220
|
-
|
221
|
-
# Set multiple keys to multiple values.
|
222
|
-
def mset(*args)
|
223
|
-
raise CannotDistribute, :mset
|
224
|
-
end
|
225
|
-
|
226
|
-
def mapped_mset(hash)
|
227
|
-
raise CannotDistribute, :mapped_mset
|
228
|
-
end
|
229
|
-
|
230
|
-
# Set multiple keys to multiple values, only if none of the keys exist.
|
231
|
-
def msetnx(*args)
|
232
|
-
raise CannotDistribute, :msetnx
|
270
|
+
# Overwrite part of a string at key starting at the specified offset.
|
271
|
+
def setrange(key, offset, value)
|
272
|
+
node_for(key).setrange(key, offset, value)
|
233
273
|
end
|
234
274
|
|
235
|
-
|
236
|
-
|
275
|
+
# Get a substring of the string stored at a key.
|
276
|
+
def getrange(key, start, stop)
|
277
|
+
node_for(key).getrange(key, start, stop)
|
237
278
|
end
|
238
279
|
|
239
|
-
#
|
240
|
-
def
|
241
|
-
node_for(key).
|
280
|
+
# Sets or clears the bit at offset in the string value stored at key.
|
281
|
+
def setbit(key, offset, value)
|
282
|
+
node_for(key).setbit(key, offset, value)
|
242
283
|
end
|
243
284
|
|
244
|
-
#
|
245
|
-
def
|
246
|
-
node_for(key).
|
285
|
+
# Returns the bit value at offset in the string value stored at key.
|
286
|
+
def getbit(key, offset)
|
287
|
+
node_for(key).getbit(key, offset)
|
247
288
|
end
|
248
289
|
|
249
|
-
#
|
250
|
-
def
|
251
|
-
node_for(key).
|
290
|
+
# Append a value to a key.
|
291
|
+
def append(key, value)
|
292
|
+
node_for(key).append(key, value)
|
252
293
|
end
|
253
294
|
|
254
|
-
#
|
255
|
-
def
|
256
|
-
node_for(key).
|
295
|
+
# Set the string value of a key and return its old value.
|
296
|
+
def getset(key, value)
|
297
|
+
node_for(key).getset(key, value)
|
257
298
|
end
|
258
299
|
|
259
|
-
#
|
260
|
-
def
|
261
|
-
node_for(key).
|
300
|
+
# Get the length of the value stored in a key.
|
301
|
+
def strlen(key)
|
302
|
+
node_for(key).strlen(key)
|
262
303
|
end
|
263
304
|
|
264
|
-
|
265
|
-
|
266
|
-
node_for(key).rpush(key, value)
|
305
|
+
def [](key)
|
306
|
+
get(key)
|
267
307
|
end
|
268
308
|
|
269
|
-
|
270
|
-
|
271
|
-
node_for(key).lpush(key, value)
|
309
|
+
def []=(key,value)
|
310
|
+
set(key, value)
|
272
311
|
end
|
273
312
|
|
274
313
|
# Get the length of a list.
|
@@ -276,29 +315,24 @@ class Redis
|
|
276
315
|
node_for(key).llen(key)
|
277
316
|
end
|
278
317
|
|
279
|
-
#
|
280
|
-
def
|
281
|
-
node_for(key).
|
282
|
-
end
|
283
|
-
|
284
|
-
# Trim a list to the specified range.
|
285
|
-
def ltrim(key, start, stop)
|
286
|
-
node_for(key).ltrim(key, start, stop)
|
318
|
+
# Prepend one or more values to a list.
|
319
|
+
def lpush(key, value)
|
320
|
+
node_for(key).lpush(key, value)
|
287
321
|
end
|
288
322
|
|
289
|
-
#
|
290
|
-
def
|
291
|
-
node_for(key).
|
323
|
+
# Prepend a value to a list, only if the list exists.
|
324
|
+
def lpushx(key, value)
|
325
|
+
node_for(key).lpushx(key, value)
|
292
326
|
end
|
293
327
|
|
294
|
-
#
|
295
|
-
def
|
296
|
-
node_for(key).
|
328
|
+
# Append one or more values to a list.
|
329
|
+
def rpush(key, value)
|
330
|
+
node_for(key).rpush(key, value)
|
297
331
|
end
|
298
332
|
|
299
|
-
#
|
300
|
-
def
|
301
|
-
node_for(key).
|
333
|
+
# Append a value to a list, only if the list exists.
|
334
|
+
def rpushx(key, value)
|
335
|
+
node_for(key).rpushx(key, value)
|
302
336
|
end
|
303
337
|
|
304
338
|
# Remove and get the first element in a list.
|
@@ -367,6 +401,41 @@ class Redis
|
|
367
401
|
end
|
368
402
|
end
|
369
403
|
|
404
|
+
# Get an element from a list by its index.
|
405
|
+
def lindex(key, index)
|
406
|
+
node_for(key).lindex(key, index)
|
407
|
+
end
|
408
|
+
|
409
|
+
# Insert an element before or after another element in a list.
|
410
|
+
def linsert(key, where, pivot, value)
|
411
|
+
node_for(key).linsert(key, where, pivot, value)
|
412
|
+
end
|
413
|
+
|
414
|
+
# Get a range of elements from a list.
|
415
|
+
def lrange(key, start, stop)
|
416
|
+
node_for(key).lrange(key, start, stop)
|
417
|
+
end
|
418
|
+
|
419
|
+
# Remove elements from a list.
|
420
|
+
def lrem(key, count, value)
|
421
|
+
node_for(key).lrem(key, count, value)
|
422
|
+
end
|
423
|
+
|
424
|
+
# Set the value of an element in a list by its index.
|
425
|
+
def lset(key, index, value)
|
426
|
+
node_for(key).lset(key, index, value)
|
427
|
+
end
|
428
|
+
|
429
|
+
# Trim a list to the specified range.
|
430
|
+
def ltrim(key, start, stop)
|
431
|
+
node_for(key).ltrim(key, start, stop)
|
432
|
+
end
|
433
|
+
|
434
|
+
# Get the number of members in a set.
|
435
|
+
def scard(key)
|
436
|
+
node_for(key).scard(key)
|
437
|
+
end
|
438
|
+
|
370
439
|
# Add one or more members to a set.
|
371
440
|
def sadd(key, member)
|
372
441
|
node_for(key).sadd(key, member)
|
@@ -382,6 +451,11 @@ class Redis
|
|
382
451
|
node_for(key).spop(key)
|
383
452
|
end
|
384
453
|
|
454
|
+
# Get a random member from a set.
|
455
|
+
def srandmember(key)
|
456
|
+
node_for(key).srandmember(key)
|
457
|
+
end
|
458
|
+
|
385
459
|
# Move a member from one set to another.
|
386
460
|
def smove(source, destination, member)
|
387
461
|
ensure_same_node(:smove, [source, destination]) do |node|
|
@@ -389,16 +463,30 @@ class Redis
|
|
389
463
|
end
|
390
464
|
end
|
391
465
|
|
392
|
-
# Get the number of members in a set.
|
393
|
-
def scard(key)
|
394
|
-
node_for(key).scard(key)
|
395
|
-
end
|
396
|
-
|
397
466
|
# Determine if a given value is a member of a set.
|
398
467
|
def sismember(key, member)
|
399
468
|
node_for(key).sismember(key, member)
|
400
469
|
end
|
401
470
|
|
471
|
+
# Get all the members in a set.
|
472
|
+
def smembers(key)
|
473
|
+
node_for(key).smembers(key)
|
474
|
+
end
|
475
|
+
|
476
|
+
# Subtract multiple sets.
|
477
|
+
def sdiff(*keys)
|
478
|
+
ensure_same_node(:sdiff, keys) do |node|
|
479
|
+
node.sdiff(*keys)
|
480
|
+
end
|
481
|
+
end
|
482
|
+
|
483
|
+
# Subtract multiple sets and store the resulting set in a key.
|
484
|
+
def sdiffstore(destination, *keys)
|
485
|
+
ensure_same_node(:sdiffstore, [destination] + keys) do |node|
|
486
|
+
node.sdiffstore(destination, *keys)
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
402
490
|
# Intersect multiple sets.
|
403
491
|
def sinter(*keys)
|
404
492
|
ensure_same_node(:sinter, keys) do |node|
|
@@ -427,28 +515,9 @@ class Redis
|
|
427
515
|
end
|
428
516
|
end
|
429
517
|
|
430
|
-
#
|
431
|
-
def
|
432
|
-
|
433
|
-
node.sdiff(*keys)
|
434
|
-
end
|
435
|
-
end
|
436
|
-
|
437
|
-
# Subtract multiple sets and store the resulting set in a key.
|
438
|
-
def sdiffstore(destination, *keys)
|
439
|
-
ensure_same_node(:sdiffstore, [destination] + keys) do |node|
|
440
|
-
node.sdiffstore(destination, *keys)
|
441
|
-
end
|
442
|
-
end
|
443
|
-
|
444
|
-
# Get all the members in a set.
|
445
|
-
def smembers(key)
|
446
|
-
node_for(key).smembers(key)
|
447
|
-
end
|
448
|
-
|
449
|
-
# Get a random member from a set.
|
450
|
-
def srandmember(key)
|
451
|
-
node_for(key).srandmember(key)
|
518
|
+
# Get the number of members in a sorted set.
|
519
|
+
def zcard(key)
|
520
|
+
node_for(key).zcard(key)
|
452
521
|
end
|
453
522
|
|
454
523
|
# Add one or more members to a sorted set, or update the score for members
|
@@ -457,14 +526,19 @@ class Redis
|
|
457
526
|
node_for(key).zadd(key, *args)
|
458
527
|
end
|
459
528
|
|
529
|
+
# Increment the score of a member in a sorted set.
|
530
|
+
def zincrby(key, increment, member)
|
531
|
+
node_for(key).zincrby(key, increment, member)
|
532
|
+
end
|
533
|
+
|
460
534
|
# Remove one or more members from a sorted set.
|
461
535
|
def zrem(key, member)
|
462
536
|
node_for(key).zrem(key, member)
|
463
537
|
end
|
464
538
|
|
465
|
-
#
|
466
|
-
def
|
467
|
-
node_for(key).
|
539
|
+
# Get the score associated with the given member in a sorted set.
|
540
|
+
def zscore(key, member)
|
541
|
+
node_for(key).zscore(key, member)
|
468
542
|
end
|
469
543
|
|
470
544
|
# Return a range of members in a sorted set, by index.
|
@@ -472,6 +546,12 @@ class Redis
|
|
472
546
|
node_for(key).zrange(key, start, stop, options)
|
473
547
|
end
|
474
548
|
|
549
|
+
# Return a range of members in a sorted set, by index, with scores ordered
|
550
|
+
# from high to low.
|
551
|
+
def zrevrange(key, start, stop, options = {})
|
552
|
+
node_for(key).zrevrange(key, start, stop, options)
|
553
|
+
end
|
554
|
+
|
475
555
|
# Determine the index of a member in a sorted set.
|
476
556
|
def zrank(key, member)
|
477
557
|
node_for(key).zrank(key, member)
|
@@ -483,17 +563,6 @@ class Redis
|
|
483
563
|
node_for(key).zrevrank(key, member)
|
484
564
|
end
|
485
565
|
|
486
|
-
# Return a range of members in a sorted set, by index, with scores ordered
|
487
|
-
# from high to low.
|
488
|
-
def zrevrange(key, start, stop, options = {})
|
489
|
-
node_for(key).zrevrange(key, start, stop, options)
|
490
|
-
end
|
491
|
-
|
492
|
-
# Remove all members in a sorted set within the given scores.
|
493
|
-
def zremrangebyscore(key, min, max)
|
494
|
-
node_for(key).zremrangebyscore(key, min, max)
|
495
|
-
end
|
496
|
-
|
497
566
|
# Remove all members in a sorted set within the given indexes.
|
498
567
|
def zremrangebyrank(key, start, stop)
|
499
568
|
node_for(key).zremrangebyrank(key, start, stop)
|
@@ -510,9 +579,9 @@ class Redis
|
|
510
579
|
node_for(key).zrevrangebyscore(key, max, min, options)
|
511
580
|
end
|
512
581
|
|
513
|
-
#
|
514
|
-
def
|
515
|
-
node_for(key).
|
582
|
+
# Remove all members in a sorted set within the given scores.
|
583
|
+
def zremrangebyscore(key, min, max)
|
584
|
+
node_for(key).zremrangebyscore(key, min, max)
|
516
585
|
end
|
517
586
|
|
518
587
|
# Get the number of members in a particular score range.
|
@@ -520,11 +589,6 @@ class Redis
|
|
520
589
|
node_for(key).zcount(key, min, max)
|
521
590
|
end
|
522
591
|
|
523
|
-
# Get the score associated with the given member in a sorted set.
|
524
|
-
def zscore(key, member)
|
525
|
-
node_for(key).zscore(key, member)
|
526
|
-
end
|
527
|
-
|
528
592
|
# Intersect multiple sorted sets and store the resulting sorted set in a new
|
529
593
|
# key.
|
530
594
|
def zinterstore(destination, keys, options = {})
|
@@ -540,6 +604,11 @@ class Redis
|
|
540
604
|
end
|
541
605
|
end
|
542
606
|
|
607
|
+
# Get the number of fields in a hash.
|
608
|
+
def hlen(key)
|
609
|
+
node_for(key).hlen(key)
|
610
|
+
end
|
611
|
+
|
543
612
|
# Set the string value of a hash field.
|
544
613
|
def hset(key, field, value)
|
545
614
|
node_for(key).hset(key, field, value)
|
@@ -550,41 +619,6 @@ class Redis
|
|
550
619
|
node_for(key).hsetnx(key, field, value)
|
551
620
|
end
|
552
621
|
|
553
|
-
# Get the value of a hash field.
|
554
|
-
def hget(key, field)
|
555
|
-
node_for(key).hget(key, field)
|
556
|
-
end
|
557
|
-
|
558
|
-
# Delete one or more hash fields.
|
559
|
-
def hdel(key, field)
|
560
|
-
node_for(key).hdel(key, field)
|
561
|
-
end
|
562
|
-
|
563
|
-
# Determine if a hash field exists.
|
564
|
-
def hexists(key, field)
|
565
|
-
node_for(key).hexists(key, field)
|
566
|
-
end
|
567
|
-
|
568
|
-
# Get the number of fields in a hash.
|
569
|
-
def hlen(key)
|
570
|
-
node_for(key).hlen(key)
|
571
|
-
end
|
572
|
-
|
573
|
-
# Get all the fields in a hash.
|
574
|
-
def hkeys(key)
|
575
|
-
node_for(key).hkeys(key)
|
576
|
-
end
|
577
|
-
|
578
|
-
# Get all the values in a hash.
|
579
|
-
def hvals(key)
|
580
|
-
node_for(key).hvals(key)
|
581
|
-
end
|
582
|
-
|
583
|
-
# Get all the fields and values in a hash.
|
584
|
-
def hgetall(key)
|
585
|
-
node_for(key).hgetall(key)
|
586
|
-
end
|
587
|
-
|
588
622
|
# Set multiple hash fields to multiple values.
|
589
623
|
def hmset(key, *attrs)
|
590
624
|
node_for(key).hmset(key, *attrs)
|
@@ -594,6 +628,11 @@ class Redis
|
|
594
628
|
node_for(key).hmset(key, *hash.to_a.flatten)
|
595
629
|
end
|
596
630
|
|
631
|
+
# Get the value of a hash field.
|
632
|
+
def hget(key, field)
|
633
|
+
node_for(key).hget(key, field)
|
634
|
+
end
|
635
|
+
|
597
636
|
# Get the values of all the given hash fields.
|
598
637
|
def hmget(key, *fields)
|
599
638
|
node_for(key).hmget(key, *fields)
|
@@ -603,6 +642,16 @@ class Redis
|
|
603
642
|
Hash[*fields.zip(hmget(key, *fields)).flatten]
|
604
643
|
end
|
605
644
|
|
645
|
+
# Delete one or more hash fields.
|
646
|
+
def hdel(key, field)
|
647
|
+
node_for(key).hdel(key, field)
|
648
|
+
end
|
649
|
+
|
650
|
+
# Determine if a hash field exists.
|
651
|
+
def hexists(key, field)
|
652
|
+
node_for(key).hexists(key, field)
|
653
|
+
end
|
654
|
+
|
606
655
|
# Increment the integer value of a hash field by the given integer number.
|
607
656
|
def hincrby(key, field, increment)
|
608
657
|
node_for(key).hincrby(key, field, increment)
|
@@ -613,38 +662,19 @@ class Redis
|
|
613
662
|
node_for(key).hincrbyfloat(key, field, increment)
|
614
663
|
end
|
615
664
|
|
616
|
-
#
|
617
|
-
def
|
618
|
-
|
619
|
-
|
620
|
-
ensure_same_node(:sort, keys) do |node|
|
621
|
-
node.sort(key, options)
|
622
|
-
end
|
623
|
-
end
|
624
|
-
|
625
|
-
# Mark the start of a transaction block.
|
626
|
-
def multi
|
627
|
-
raise CannotDistribute, :multi
|
628
|
-
end
|
629
|
-
|
630
|
-
# Watch the given keys to determine execution of the MULTI/EXEC block.
|
631
|
-
def watch(*keys)
|
632
|
-
raise CannotDistribute, :watch
|
633
|
-
end
|
634
|
-
|
635
|
-
# Forget about all watched keys.
|
636
|
-
def unwatch
|
637
|
-
raise CannotDistribute, :unwatch
|
665
|
+
# Get all the fields in a hash.
|
666
|
+
def hkeys(key)
|
667
|
+
node_for(key).hkeys(key)
|
638
668
|
end
|
639
669
|
|
640
|
-
#
|
641
|
-
def
|
642
|
-
|
670
|
+
# Get all the values in a hash.
|
671
|
+
def hvals(key)
|
672
|
+
node_for(key).hvals(key)
|
643
673
|
end
|
644
674
|
|
645
|
-
#
|
646
|
-
def
|
647
|
-
|
675
|
+
# Get all the fields and values in a hash.
|
676
|
+
def hgetall(key)
|
677
|
+
node_for(key).hgetall(key)
|
648
678
|
end
|
649
679
|
|
650
680
|
# Post a message to a channel.
|
@@ -656,12 +686,6 @@ class Redis
|
|
656
686
|
!! @subscribed_node
|
657
687
|
end
|
658
688
|
|
659
|
-
# Stop listening for messages posted to the given channels.
|
660
|
-
def unsubscribe(*channels)
|
661
|
-
raise RuntimeError, "Can't unsubscribe if not subscribed." unless subscribed?
|
662
|
-
@subscribed_node.unsubscribe(*channels)
|
663
|
-
end
|
664
|
-
|
665
689
|
# Listen for messages published to the given channels.
|
666
690
|
def subscribe(channel, *channels, &block)
|
667
691
|
if channels.empty?
|
@@ -675,54 +699,78 @@ class Redis
|
|
675
699
|
end
|
676
700
|
end
|
677
701
|
|
702
|
+
# Stop listening for messages posted to the given channels.
|
703
|
+
def unsubscribe(*channels)
|
704
|
+
raise RuntimeError, "Can't unsubscribe if not subscribed." unless subscribed?
|
705
|
+
@subscribed_node.unsubscribe(*channels)
|
706
|
+
end
|
707
|
+
|
708
|
+
# Listen for messages published to channels matching the given patterns.
|
709
|
+
def psubscribe(*channels, &block)
|
710
|
+
raise NotImplementedError
|
711
|
+
end
|
712
|
+
|
678
713
|
# Stop listening for messages posted to channels matching the given
|
679
714
|
# patterns.
|
680
715
|
def punsubscribe(*channels)
|
681
716
|
raise NotImplementedError
|
682
717
|
end
|
683
718
|
|
684
|
-
#
|
685
|
-
def
|
686
|
-
raise
|
719
|
+
# Watch the given keys to determine execution of the MULTI/EXEC block.
|
720
|
+
def watch(*keys)
|
721
|
+
raise CannotDistribute, :watch
|
687
722
|
end
|
688
723
|
|
689
|
-
#
|
690
|
-
def
|
691
|
-
|
724
|
+
# Forget about all watched keys.
|
725
|
+
def unwatch
|
726
|
+
raise CannotDistribute, :unwatch
|
692
727
|
end
|
693
728
|
|
694
|
-
|
695
|
-
|
696
|
-
on_each_node :bgsave
|
729
|
+
def pipelined
|
730
|
+
raise CannotDistribute, :pipelined
|
697
731
|
end
|
698
732
|
|
699
|
-
#
|
700
|
-
def
|
701
|
-
|
733
|
+
# Mark the start of a transaction block.
|
734
|
+
def multi
|
735
|
+
raise CannotDistribute, :multi
|
702
736
|
end
|
703
737
|
|
704
|
-
#
|
705
|
-
def
|
706
|
-
|
738
|
+
# Execute all commands issued after MULTI.
|
739
|
+
def exec
|
740
|
+
raise CannotDistribute, :exec
|
707
741
|
end
|
708
742
|
|
709
|
-
#
|
710
|
-
def
|
711
|
-
raise
|
743
|
+
# Discard all commands issued after MULTI.
|
744
|
+
def discard
|
745
|
+
raise CannotDistribute, :discard
|
712
746
|
end
|
713
747
|
|
714
|
-
#
|
715
|
-
def
|
716
|
-
on_each_node
|
748
|
+
# Control remote script registry.
|
749
|
+
def script(subcommand, *args)
|
750
|
+
on_each_node(:script, subcommand, *args)
|
717
751
|
end
|
718
752
|
|
719
|
-
|
720
|
-
|
721
|
-
|
753
|
+
def _eval(cmd, args)
|
754
|
+
script = args.shift
|
755
|
+
options = args.pop if args.last.is_a?(Hash)
|
756
|
+
options ||= {}
|
757
|
+
|
758
|
+
keys = args.shift || options[:keys] || []
|
759
|
+
argv = args.shift || options[:argv] || []
|
760
|
+
|
761
|
+
ensure_same_node(cmd, keys) do |node|
|
762
|
+
node.send(cmd, script, keys, argv)
|
763
|
+
end
|
722
764
|
end
|
723
765
|
|
724
|
-
|
725
|
-
|
766
|
+
# Evaluate Lua script.
|
767
|
+
def eval(*args)
|
768
|
+
_eval(:eval, args)
|
769
|
+
end
|
770
|
+
|
771
|
+
# Evaluate Lua script by its SHA.
|
772
|
+
def evalsha(*args)
|
773
|
+
_eval(:evalsha, args)
|
726
774
|
end
|
727
775
|
|
728
776
|
def inspect
|
@@ -746,9 +794,18 @@ class Redis
|
|
746
794
|
end
|
747
795
|
|
748
796
|
def ensure_same_node(command, keys)
|
749
|
-
|
797
|
+
all = true
|
798
|
+
|
799
|
+
tags = keys.map do |key|
|
800
|
+
tag = key_tag(key)
|
801
|
+
all = false unless tag
|
802
|
+
tag
|
803
|
+
end
|
750
804
|
|
751
|
-
|
805
|
+
if (all && tags.uniq.size != 1) || (!all && keys.uniq.size != 1)
|
806
|
+
# Not 1 unique tag or not 1 unique key
|
807
|
+
raise CannotDistribute, command
|
808
|
+
end
|
752
809
|
|
753
810
|
yield(node_for(keys.first))
|
754
811
|
end
|