Class: Redis::Distributed

Inherits:
Object
  • Object
show all
Defined in:
lib/redis/distributed.rb

Defined Under Namespace

Classes: CannotDistribute

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(node_configs, options = {}) ⇒ Distributed

Returns a new instance of Distributed.



18
19
20
21
22
23
24
# File 'lib/redis/distributed.rb', line 18

def initialize(node_configs, options = {})
  @tag = options.delete(:tag) || /^\{(.+?)\}/
  @default_options = options
  @ring = HashRing.new
  node_configs.each { |node_config| add_node(node_config) }
  @subscribed_node = nil
end

Instance Attribute Details

#ringObject (readonly)

Returns the value of attribute ring.



16
17
18
# File 'lib/redis/distributed.rb', line 16

def ring
  @ring
end

Instance Method Details

#[](key) ⇒ Object



330
331
332
# File 'lib/redis/distributed.rb', line 330

def [](key)
  get(key)
end

#[]=(key, value) ⇒ Object



334
335
336
# File 'lib/redis/distributed.rb', line 334

def []=(key,value)
  set(key, value)
end

#_bpop(cmd, args) ⇒ Object



381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
# File 'lib/redis/distributed.rb', line 381

def _bpop(cmd, args)
  options = {}

  case args.last
  when Hash
    options = args.pop
  when Integer
    # Issue deprecation notice in obnoxious mode...
    options[:timeout] = args.pop
  end

  if args.size > 1
    # Issue deprecation notice in obnoxious mode...
  end

  keys = args.flatten

  ensure_same_node(cmd, keys) do |node|
    node.__send__(cmd, keys, options)
  end
end

#_eval(cmd, args) ⇒ Object



778
779
780
781
782
783
784
785
786
787
788
789
# File 'lib/redis/distributed.rb', line 778

def _eval(cmd, args)
  script = args.shift
  options = args.pop if args.last.is_a?(Hash)
  options ||= {}

  keys = args.shift || options[:keys] || []
  argv = args.shift || options[:argv] || []

  ensure_same_node(cmd, keys) do |node|
    node.send(cmd, script, keys, argv)
  end
end

#add_node(options) ⇒ Object



34
35
36
37
38
# File 'lib/redis/distributed.rb', line 34

def add_node(options)
  options = { :url => options } if options.is_a?(String)
  options = @default_options.merge(options)
  @ring.add_node Redis.new( options )
end

#append(key, value) ⇒ Object

Append a value to a key.



304
305
306
# File 'lib/redis/distributed.rb', line 304

def append(key, value)
  node_for(key).append(key, value)
end

#bgsaveObject

Asynchronously save the dataset to disk.



61
62
63
# File 'lib/redis/distributed.rb', line 61

def bgsave
  on_each_node :bgsave
end

#bitcount(key, start = 0, stop = -1)) ⇒ Object

Count the number of set bits in a range of the string value stored at key.



309
310
311
# File 'lib/redis/distributed.rb', line 309

def bitcount(key, start = 0, stop = -1)
  node_for(key).bitcount(key, start, stop)
end

#bitop(operation, destkey, *keys) ⇒ Object

Perform a bitwise operation between strings and store the resulting string in a key.



314
315
316
317
318
# File 'lib/redis/distributed.rb', line 314

def bitop(operation, destkey, *keys)
  ensure_same_node(:bitop, [destkey] + keys) do |node|
    node.bitop(operation, destkey, *keys)
  end
end

#blpop(*args) ⇒ Object

Remove and get the first element in a list, or block until one is available.



405
406
407
# File 'lib/redis/distributed.rb', line 405

def blpop(*args)
  _bpop(:blpop, args)
end

#brpop(*args) ⇒ Object

Remove and get the last element in a list, or block until one is available.



411
412
413
# File 'lib/redis/distributed.rb', line 411

def brpop(*args)
  _bpop(:brpop, args)
end

#brpoplpush(source, destination, options = {}) ⇒ Object

Pop a value from a list, push it to another list and return it; or block until one is available.



417
418
419
420
421
422
423
424
425
426
427
# File 'lib/redis/distributed.rb', line 417

def brpoplpush(source, destination, options = {})
  case options
  when Integer
    # Issue deprecation notice in obnoxious mode...
    options = { :timeout => options }
  end

  ensure_same_node(:brpoplpush, [source, destination]) do |node|
    node.brpoplpush(source, destination, options)
  end
end

#dbsizeObject

Return the number of keys in the selected database.



66
67
68
# File 'lib/redis/distributed.rb', line 66

def dbsize
  on_each_node :dbsize
end

#decr(key) ⇒ Object

Decrement the integer value of a key by one.



207
208
209
# File 'lib/redis/distributed.rb', line 207

def decr(key)
  node_for(key).decr(key)
end

#decrby(key, decrement) ⇒ Object

Decrement the integer value of a key by the given number.



212
213
214
# File 'lib/redis/distributed.rb', line 212

def decrby(key, decrement)
  node_for(key).decrby(key, decrement)
end

#del(*args) ⇒ Object

Delete a key.



151
152
153
154
155
156
# File 'lib/redis/distributed.rb', line 151

def del(*args)
  keys_per_node = args.group_by { |key| node_for(key) }
  keys_per_node.inject(0) do |sum, (node, keys)|
    sum + node.del(*keys)
  end
end

#discardObject

Discard all commands issued after MULTI.

Raises:



769
770
771
# File 'lib/redis/distributed.rb', line 769

def discard
  raise CannotDistribute, :discard
end

#dump(key) ⇒ Object

Return a serialized version of the value stored at a key.



141
142
143
# File 'lib/redis/distributed.rb', line 141

def dump(key)
  node_for(key).dump(key)
end

#echo(value) ⇒ Object

Echo the given string.



51
52
53
# File 'lib/redis/distributed.rb', line 51

def echo(value)
  on_each_node :echo, value
end

#eval(*args) ⇒ Object

Evaluate Lua script.



792
793
794
# File 'lib/redis/distributed.rb', line 792

def eval(*args)
  _eval(:eval, args)
end

#evalsha(*args) ⇒ Object

Evaluate Lua script by its SHA.



797
798
799
# File 'lib/redis/distributed.rb', line 797

def evalsha(*args)
  _eval(:evalsha, args)
end

#execObject

Execute all commands issued after MULTI.

Raises:



764
765
766
# File 'lib/redis/distributed.rb', line 764

def exec
  raise CannotDistribute, :exec
end

#exists(key) ⇒ Object

Determine if a key exists.



159
160
161
# File 'lib/redis/distributed.rb', line 159

def exists(key)
  node_for(key).exists(key)
end

#expire(key, seconds) ⇒ Object

Set a key's time to live in seconds.



111
112
113
# File 'lib/redis/distributed.rb', line 111

def expire(key, seconds)
  node_for(key).expire(key, seconds)
end

#expireat(key, unix_time) ⇒ Object

Set the expiration for a key as a UNIX timestamp.



116
117
118
# File 'lib/redis/distributed.rb', line 116

def expireat(key, unix_time)
  node_for(key).expireat(key, unix_time)
end

#flushallObject

Remove all keys from all databases.



71
72
73
# File 'lib/redis/distributed.rb', line 71

def flushall
  on_each_node :flushall
end

#flushdbObject

Remove all keys from the current database.



76
77
78
# File 'lib/redis/distributed.rb', line 76

def flushdb
  on_each_node :flushdb
end

#get(key) ⇒ Object

Get the value of a key.



270
271
272
# File 'lib/redis/distributed.rb', line 270

def get(key)
  node_for(key).get(key)
end

#getbit(key, offset) ⇒ Object

Returns the bit value at offset in the string value stored at key.



299
300
301
# File 'lib/redis/distributed.rb', line 299

def getbit(key, offset)
  node_for(key).getbit(key, offset)
end

#getrange(key, start, stop) ⇒ Object

Get a substring of the string stored at a key.



289
290
291
# File 'lib/redis/distributed.rb', line 289

def getrange(key, start, stop)
  node_for(key).getrange(key, start, stop)
end

#getset(key, value) ⇒ Object

Set the string value of a key and return its old value.



321
322
323
# File 'lib/redis/distributed.rb', line 321

def getset(key, value)
  node_for(key).getset(key, value)
end

#hdel(key, field) ⇒ Object

Delete one or more hash fields.



671
672
673
# File 'lib/redis/distributed.rb', line 671

def hdel(key, field)
  node_for(key).hdel(key, field)
end

#hexists(key, field) ⇒ Object

Determine if a hash field exists.



676
677
678
# File 'lib/redis/distributed.rb', line 676

def hexists(key, field)
  node_for(key).hexists(key, field)
end

#hget(key, field) ⇒ Object

Get the value of a hash field.



657
658
659
# File 'lib/redis/distributed.rb', line 657

def hget(key, field)
  node_for(key).hget(key, field)
end

#hgetall(key) ⇒ Object

Get all the fields and values in a hash.



701
702
703
# File 'lib/redis/distributed.rb', line 701

def hgetall(key)
  node_for(key).hgetall(key)
end

#hincrby(key, field, increment) ⇒ Object

Increment the integer value of a hash field by the given integer number.



681
682
683
# File 'lib/redis/distributed.rb', line 681

def hincrby(key, field, increment)
  node_for(key).hincrby(key, field, increment)
end

#hincrbyfloat(key, field, increment) ⇒ Object

Increment the numeric value of a hash field by the given float number.



686
687
688
# File 'lib/redis/distributed.rb', line 686

def hincrbyfloat(key, field, increment)
  node_for(key).hincrbyfloat(key, field, increment)
end

#hkeys(key) ⇒ Object

Get all the fields in a hash.



691
692
693
# File 'lib/redis/distributed.rb', line 691

def hkeys(key)
  node_for(key).hkeys(key)
end

#hlen(key) ⇒ Object

Get the number of fields in a hash.



633
634
635
# File 'lib/redis/distributed.rb', line 633

def hlen(key)
  node_for(key).hlen(key)
end

#hmget(key, *fields) ⇒ Object

Get the values of all the given hash fields.



662
663
664
# File 'lib/redis/distributed.rb', line 662

def hmget(key, *fields)
  node_for(key).hmget(key, *fields)
end

#hmset(key, *attrs) ⇒ Object

Set multiple hash fields to multiple values.



648
649
650
# File 'lib/redis/distributed.rb', line 648

def hmset(key, *attrs)
  node_for(key).hmset(key, *attrs)
end

#hset(key, field, value) ⇒ Object

Set the string value of a hash field.



638
639
640
# File 'lib/redis/distributed.rb', line 638

def hset(key, field, value)
  node_for(key).hset(key, field, value)
end

#hsetnx(key, field, value) ⇒ Object

Set the value of a hash field, only if the field does not exist.



643
644
645
# File 'lib/redis/distributed.rb', line 643

def hsetnx(key, field, value)
  node_for(key).hsetnx(key, field, value)
end

#hvals(key) ⇒ Object

Get all the values in a hash.



696
697
698
# File 'lib/redis/distributed.rb', line 696

def hvals(key)
  node_for(key).hvals(key)
end

#incr(key) ⇒ Object

Increment the integer value of a key by one.



217
218
219
# File 'lib/redis/distributed.rb', line 217

def incr(key)
  node_for(key).incr(key)
end

#incrby(key, increment) ⇒ Object

Increment the integer value of a key by the given integer number.



222
223
224
# File 'lib/redis/distributed.rb', line 222

def incrby(key, increment)
  node_for(key).incrby(key, increment)
end

#incrbyfloat(key, increment) ⇒ Object

Increment the numeric value of a key by the given float number.



227
228
229
# File 'lib/redis/distributed.rb', line 227

def incrbyfloat(key, increment)
  node_for(key).incrbyfloat(key, increment)
end

#info(cmd = nil) ⇒ Object

Get information and statistics about the server.



81
82
83
# File 'lib/redis/distributed.rb', line 81

def info(cmd = nil)
  on_each_node :info, cmd
end

#inspectObject



801
802
803
# File 'lib/redis/distributed.rb', line 801

def inspect
  "#<Redis client v#{Redis::VERSION} for #{nodes.map(&:id).join(', ')}>"
end

#keys(glob = "*") ⇒ Object

Find all keys matching the given pattern.



164
165
166
# File 'lib/redis/distributed.rb', line 164

def keys(glob = "*")
  on_each_node(:keys, glob).flatten
end

#lastsaveObject

Get the UNIX time stamp of the last successful save to disk.



86
87
88
# File 'lib/redis/distributed.rb', line 86

def lastsave
  on_each_node :lastsave
end

#lindex(key, index) ⇒ Object

Get an element from a list by its index.



430
431
432
# File 'lib/redis/distributed.rb', line 430

def lindex(key, index)
  node_for(key).lindex(key, index)
end

#linsert(key, where, pivot, value) ⇒ Object

Insert an element before or after another element in a list.



435
436
437
# File 'lib/redis/distributed.rb', line 435

def linsert(key, where, pivot, value)
  node_for(key).linsert(key, where, pivot, value)
end

#llen(key) ⇒ Object

Get the length of a list.



339
340
341
# File 'lib/redis/distributed.rb', line 339

def llen(key)
  node_for(key).llen(key)
end

#lpop(key) ⇒ Object

Remove and get the first element in a list.



364
365
366
# File 'lib/redis/distributed.rb', line 364

def lpop(key)
  node_for(key).lpop(key)
end

#lpush(key, value) ⇒ Object

Prepend one or more values to a list.



344
345
346
# File 'lib/redis/distributed.rb', line 344

def lpush(key, value)
  node_for(key).lpush(key, value)
end

#lpushx(key, value) ⇒ Object

Prepend a value to a list, only if the list exists.



349
350
351
# File 'lib/redis/distributed.rb', line 349

def lpushx(key, value)
  node_for(key).lpushx(key, value)
end

#lrange(key, start, stop) ⇒ Object

Get a range of elements from a list.



440
441
442
# File 'lib/redis/distributed.rb', line 440

def lrange(key, start, stop)
  node_for(key).lrange(key, start, stop)
end

#lrem(key, count, value) ⇒ Object

Remove elements from a list.



445
446
447
# File 'lib/redis/distributed.rb', line 445

def lrem(key, count, value)
  node_for(key).lrem(key, count, value)
end

#lset(key, index, value) ⇒ Object

Set the value of an element in a list by its index.



450
451
452
# File 'lib/redis/distributed.rb', line 450

def lset(key, index, value)
  node_for(key).lset(key, index, value)
end

#ltrim(key, start, stop) ⇒ Object

Trim a list to the specified range.



455
456
457
# File 'lib/redis/distributed.rb', line 455

def ltrim(key, start, stop)
  node_for(key).ltrim(key, start, stop)
end

#mapped_hmget(key, *fields) ⇒ Object



666
667
668
# File 'lib/redis/distributed.rb', line 666

def mapped_hmget(key, *fields)
  Hash[*fields.zip(hmget(key, *fields)).flatten]
end

#mapped_hmset(key, hash) ⇒ Object



652
653
654
# File 'lib/redis/distributed.rb', line 652

def mapped_hmset(key, hash)
  node_for(key).hmset(key, *hash.to_a.flatten)
end

#mapped_mget(*keys) ⇒ Object

Raises:



279
280
281
# File 'lib/redis/distributed.rb', line 279

def mapped_mget(*keys)
  raise CannotDistribute, :mapped_mget
end

#mapped_mset(hash) ⇒ Object

Raises:



256
257
258
# File 'lib/redis/distributed.rb', line 256

def mapped_mset(hash)
  raise CannotDistribute, :mapped_mset
end

#mapped_msetnx(hash) ⇒ Object

Raises:



265
266
267
# File 'lib/redis/distributed.rb', line 265

def mapped_msetnx(hash)
  raise CannotDistribute, :mapped_msetnx
end

#mget(*keys) ⇒ Object

Get the values of all the given keys.

Raises:



275
276
277
# File 'lib/redis/distributed.rb', line 275

def mget(*keys)
  raise CannotDistribute, :mget
end

#monitorObject

Listen for all requests received by the server in real time.

Raises:

  • (NotImplementedError)


91
92
93
# File 'lib/redis/distributed.rb', line 91

def monitor
  raise NotImplementedError
end

#move(key, db) ⇒ Object

Move a key to another database.



169
170
171
# File 'lib/redis/distributed.rb', line 169

def move(key, db)
  node_for(key).move(key, db)
end

#mset(*args) ⇒ Object

Set multiple keys to multiple values.

Raises:



252
253
254
# File 'lib/redis/distributed.rb', line 252

def mset(*args)
  raise CannotDistribute, :mset
end

#msetnx(*args) ⇒ Object

Set multiple keys to multiple values, only if none of the keys exist.

Raises:



261
262
263
# File 'lib/redis/distributed.rb', line 261

def msetnx(*args)
  raise CannotDistribute, :msetnx
end

#multiObject

Mark the start of a transaction block.

Raises:



759
760
761
# File 'lib/redis/distributed.rb', line 759

def multi
  raise CannotDistribute, :multi
end

#node_for(key) ⇒ Object



26
27
28
# File 'lib/redis/distributed.rb', line 26

def node_for(key)
  @ring.get_node(key_tag(key.to_s) || key.to_s)
end

#nodesObject



30
31
32
# File 'lib/redis/distributed.rb', line 30

def nodes
  @ring.nodes
end

#persist(key) ⇒ Object

Remove the expiration from a key.



106
107
108
# File 'lib/redis/distributed.rb', line 106

def persist(key)
  node_for(key).persist(key)
end

#pexpire(key, milliseconds) ⇒ Object

Set a key's time to live in milliseconds.



126
127
128
# File 'lib/redis/distributed.rb', line 126

def pexpire(key, milliseconds)
  node_for(key).pexpire(key, milliseconds)
end

#pexpireat(key, ms_unix_time) ⇒ Object

Set the expiration for a key as number of milliseconds from UNIX Epoch.



131
132
133
# File 'lib/redis/distributed.rb', line 131

def pexpireat(key, ms_unix_time)
  node_for(key).pexpireat(key, ms_unix_time)
end

#pingObject

Ping the server.



46
47
48
# File 'lib/redis/distributed.rb', line 46

def ping
  on_each_node :ping
end

#pipelinedObject

Raises:



754
755
756
# File 'lib/redis/distributed.rb', line 754

def pipelined
  raise CannotDistribute, :pipelined
end

#psetex(key, ttl, value) ⇒ Object

Set the time to live in milliseconds of a key.



242
243
244
# File 'lib/redis/distributed.rb', line 242

def psetex(key, ttl, value)
  node_for(key).psetex(key, ttl, value)
end

#psubscribe(*channels, &block) ⇒ Object

Listen for messages published to channels matching the given patterns.

Raises:

  • (NotImplementedError)


734
735
736
# File 'lib/redis/distributed.rb', line 734

def psubscribe(*channels, &block)
  raise NotImplementedError
end

#pttl(key) ⇒ Object

Get the time to live (in milliseconds) for a key.



136
137
138
# File 'lib/redis/distributed.rb', line 136

def pttl(key)
  node_for(key).pttl(key)
end

#publish(channel, message) ⇒ Object

Post a message to a channel.



706
707
708
# File 'lib/redis/distributed.rb', line 706

def publish(channel, message)
  node_for(channel).publish(channel, message)
end

#punsubscribe(*channels) ⇒ Object

Stop listening for messages posted to channels matching the given patterns.

Raises:

  • (NotImplementedError)


740
741
742
# File 'lib/redis/distributed.rb', line 740

def punsubscribe(*channels)
  raise NotImplementedError
end

#quitObject

Close the connection.



56
57
58
# File 'lib/redis/distributed.rb', line 56

def quit
  on_each_node :quit
end

#randomkeyObject

Return a random key from the keyspace.

Raises:



174
175
176
# File 'lib/redis/distributed.rb', line 174

def randomkey
  raise CannotDistribute, :randomkey
end

#rename(old_name, new_name) ⇒ Object

Rename a key.



179
180
181
182
183
# File 'lib/redis/distributed.rb', line 179

def rename(old_name, new_name)
  ensure_same_node(:rename, [old_name, new_name]) do |node|
    node.rename(old_name, new_name)
  end
end

#renamenx(old_name, new_name) ⇒ Object

Rename a key, only if the new key does not exist.



186
187
188
189
190
# File 'lib/redis/distributed.rb', line 186

def renamenx(old_name, new_name)
  ensure_same_node(:renamenx, [old_name, new_name]) do |node|
    node.renamenx(old_name, new_name)
  end
end

#restore(key, ttl, serialized_value) ⇒ Object

Create a key using the serialized value, previously obtained using DUMP.



146
147
148
# File 'lib/redis/distributed.rb', line 146

def restore(key, ttl, serialized_value)
  node_for(key).restore(key, ttl, serialized_value)
end

#rpop(key) ⇒ Object

Remove and get the last element in a list.



369
370
371
# File 'lib/redis/distributed.rb', line 369

def rpop(key)
  node_for(key).rpop(key)
end

#rpoplpush(source, destination) ⇒ Object

Remove the last element in a list, append it to another list and return it.



375
376
377
378
379
# File 'lib/redis/distributed.rb', line 375

def rpoplpush(source, destination)
  ensure_same_node(:rpoplpush, [source, destination]) do |node|
    node.rpoplpush(source, destination)
  end
end

#rpush(key, value) ⇒ Object

Append one or more values to a list.



354
355
356
# File 'lib/redis/distributed.rb', line 354

def rpush(key, value)
  node_for(key).rpush(key, value)
end

#rpushx(key, value) ⇒ Object

Append a value to a list, only if the list exists.



359
360
361
# File 'lib/redis/distributed.rb', line 359

def rpushx(key, value)
  node_for(key).rpushx(key, value)
end

#sadd(key, member) ⇒ Object

Add one or more members to a set.



465
466
467
# File 'lib/redis/distributed.rb', line 465

def sadd(key, member)
  node_for(key).sadd(key, member)
end

#saveObject

Synchronously save the dataset to disk.



96
97
98
# File 'lib/redis/distributed.rb', line 96

def save
  on_each_node :save
end

#scard(key) ⇒ Object

Get the number of members in a set.



460
461
462
# File 'lib/redis/distributed.rb', line 460

def scard(key)
  node_for(key).scard(key)
end

#script(subcommand, *args) ⇒ Object

Control remote script registry.



774
775
776
# File 'lib/redis/distributed.rb', line 774

def script(subcommand, *args)
  on_each_node(:script, subcommand, *args)
end

#sdiff(*keys) ⇒ Object

Subtract multiple sets.



502
503
504
505
506
# File 'lib/redis/distributed.rb', line 502

def sdiff(*keys)
  ensure_same_node(:sdiff, keys) do |node|
    node.sdiff(*keys)
  end
end

#sdiffstore(destination, *keys) ⇒ Object

Subtract multiple sets and store the resulting set in a key.



509
510
511
512
513
# File 'lib/redis/distributed.rb', line 509

def sdiffstore(destination, *keys)
  ensure_same_node(:sdiffstore, [destination] + keys) do |node|
    node.sdiffstore(destination, *keys)
  end
end

#select(db) ⇒ Object

Change the selected database for the current connection.



41
42
43
# File 'lib/redis/distributed.rb', line 41

def select(db)
  on_each_node :select, db
end

#set(key, value) ⇒ Object

Set the string value of a key.



232
233
234
# File 'lib/redis/distributed.rb', line 232

def set(key, value)
  node_for(key).set(key, value)
end

#setbit(key, offset, value) ⇒ Object

Sets or clears the bit at offset in the string value stored at key.



294
295
296
# File 'lib/redis/distributed.rb', line 294

def setbit(key, offset, value)
  node_for(key).setbit(key, offset, value)
end

#setex(key, ttl, value) ⇒ Object

Set the time to live in seconds of a key.



237
238
239
# File 'lib/redis/distributed.rb', line 237

def setex(key, ttl, value)
  node_for(key).setex(key, ttl, value)
end

#setnx(key, value) ⇒ Object

Set the value of a key, only if the key does not exist.



247
248
249
# File 'lib/redis/distributed.rb', line 247

def setnx(key, value)
  node_for(key).setnx(key, value)
end

#setrange(key, offset, value) ⇒ Object

Overwrite part of a string at key starting at the specified offset.



284
285
286
# File 'lib/redis/distributed.rb', line 284

def setrange(key, offset, value)
  node_for(key).setrange(key, offset, value)
end

#sinter(*keys) ⇒ Object

Intersect multiple sets.



516
517
518
519
520
# File 'lib/redis/distributed.rb', line 516

def sinter(*keys)
  ensure_same_node(:sinter, keys) do |node|
    node.sinter(*keys)
  end
end

#sinterstore(destination, *keys) ⇒ Object

Intersect multiple sets and store the resulting set in a key.



523
524
525
526
527
# File 'lib/redis/distributed.rb', line 523

def sinterstore(destination, *keys)
  ensure_same_node(:sinterstore, [destination] + keys) do |node|
    node.sinterstore(destination, *keys)
  end
end

#sismember(key, member) ⇒ Object

Determine if a given value is a member of a set.



492
493
494
# File 'lib/redis/distributed.rb', line 492

def sismember(key, member)
  node_for(key).sismember(key, member)
end

#smembers(key) ⇒ Object

Get all the members in a set.



497
498
499
# File 'lib/redis/distributed.rb', line 497

def smembers(key)
  node_for(key).smembers(key)
end

#smove(source, destination, member) ⇒ Object

Move a member from one set to another.



485
486
487
488
489
# File 'lib/redis/distributed.rb', line 485

def smove(source, destination, member)
  ensure_same_node(:smove, [source, destination]) do |node|
    node.smove(source, destination, member)
  end
end

#sort(key, options = {}) ⇒ Object

Sort the elements in a list, set or sorted set.



193
194
195
196
197
198
199
# File 'lib/redis/distributed.rb', line 193

def sort(key, options = {})
  keys = [key, options[:by], options[:store], *Array(options[:get])].compact

  ensure_same_node(:sort, keys) do |node|
    node.sort(key, options)
  end
end

#spop(key) ⇒ Object

Remove and return a random member from a set.



475
476
477
# File 'lib/redis/distributed.rb', line 475

def spop(key)
  node_for(key).spop(key)
end

#srandmember(key, count = nil) ⇒ Object

Get a random member from a set.



480
481
482
# File 'lib/redis/distributed.rb', line 480

def srandmember(key, count = nil)
  node_for(key).srandmember(key, count)
end

#srem(key, member) ⇒ Object

Remove one or more members from a set.



470
471
472
# File 'lib/redis/distributed.rb', line 470

def srem(key, member)
  node_for(key).srem(key, member)
end

#strlen(key) ⇒ Object

Get the length of the value stored in a key.



326
327
328
# File 'lib/redis/distributed.rb', line 326

def strlen(key)
  node_for(key).strlen(key)
end

#subscribe(channel, *channels, &block) ⇒ Object

Listen for messages published to the given channels.



715
716
717
718
719
720
721
722
723
724
725
# File 'lib/redis/distributed.rb', line 715

def subscribe(channel, *channels, &block)
  if channels.empty?
    @subscribed_node = node_for(channel)
    @subscribed_node.subscribe(channel, &block)
  else
    ensure_same_node(:subscribe, [channel] + channels) do |node|
      @subscribed_node = node
      node.subscribe(channel, *channels, &block)
    end
  end
end

#subscribed?Boolean

Returns:

  • (Boolean)


710
711
712
# File 'lib/redis/distributed.rb', line 710

def subscribed?
  !! @subscribed_node
end

#sunion(*keys) ⇒ Object

Add multiple sets.



530
531
532
533
534
# File 'lib/redis/distributed.rb', line 530

def sunion(*keys)
  ensure_same_node(:sunion, keys) do |node|
    node.sunion(*keys)
  end
end

#sunionstore(destination, *keys) ⇒ Object

Add multiple sets and store the resulting set in a key.



537
538
539
540
541
# File 'lib/redis/distributed.rb', line 537

def sunionstore(destination, *keys)
  ensure_same_node(:sunionstore, [destination] + keys) do |node|
    node.sunionstore(destination, *keys)
  end
end

#timeObject

Get server time: an UNIX timestamp and the elapsed microseconds in the current second.



101
102
103
# File 'lib/redis/distributed.rb', line 101

def time
  on_each_node :time
end

#ttl(key) ⇒ Object

Get the time to live (in seconds) for a key.



121
122
123
# File 'lib/redis/distributed.rb', line 121

def ttl(key)
  node_for(key).ttl(key)
end

#type(key) ⇒ Object

Determine the type stored at key.



202
203
204
# File 'lib/redis/distributed.rb', line 202

def type(key)
  node_for(key).type(key)
end

#unsubscribe(*channels) ⇒ Object

Stop listening for messages posted to the given channels.

Raises:

  • (RuntimeError)


728
729
730
731
# File 'lib/redis/distributed.rb', line 728

def unsubscribe(*channels)
  raise RuntimeError, "Can't unsubscribe if not subscribed." unless subscribed?
  @subscribed_node.unsubscribe(*channels)
end

#unwatchObject

Forget about all watched keys.

Raises:



750
751
752
# File 'lib/redis/distributed.rb', line 750

def unwatch
  raise CannotDistribute, :unwatch
end

#watch(*keys) ⇒ Object

Watch the given keys to determine execution of the MULTI/EXEC block.

Raises:



745
746
747
# File 'lib/redis/distributed.rb', line 745

def watch(*keys)
  raise CannotDistribute, :watch
end

#zadd(key, *args) ⇒ Object

Add one or more members to a sorted set, or update the score for members that already exist.



550
551
552
# File 'lib/redis/distributed.rb', line 550

def zadd(key, *args)
  node_for(key).zadd(key, *args)
end

#zcard(key) ⇒ Object

Get the number of members in a sorted set.



544
545
546
# File 'lib/redis/distributed.rb', line 544

def zcard(key)
  node_for(key).zcard(key)
end

#zcount(key, min, max) ⇒ Object

Get the number of members in a particular score range.



613
614
615
# File 'lib/redis/distributed.rb', line 613

def zcount(key, min, max)
  node_for(key).zcount(key, min, max)
end

#zincrby(key, increment, member) ⇒ Object

Increment the score of a member in a sorted set.



555
556
557
# File 'lib/redis/distributed.rb', line 555

def zincrby(key, increment, member)
  node_for(key).zincrby(key, increment, member)
end

#zinterstore(destination, keys, options = {}) ⇒ Object

Intersect multiple sorted sets and store the resulting sorted set in a new key.



619
620
621
622
623
# File 'lib/redis/distributed.rb', line 619

def zinterstore(destination, keys, options = {})
  ensure_same_node(:zinterstore, [destination] + keys) do |node|
    node.zinterstore(destination, keys, options)
  end
end

#zrange(key, start, stop, options = {}) ⇒ Object

Return a range of members in a sorted set, by index.



570
571
572
# File 'lib/redis/distributed.rb', line 570

def zrange(key, start, stop, options = {})
  node_for(key).zrange(key, start, stop, options)
end

#zrangebyscore(key, min, max, options = {}) ⇒ Object

Return a range of members in a sorted set, by score.



597
598
599
# File 'lib/redis/distributed.rb', line 597

def zrangebyscore(key, min, max, options = {})
  node_for(key).zrangebyscore(key, min, max, options)
end

#zrank(key, member) ⇒ Object

Determine the index of a member in a sorted set.



581
582
583
# File 'lib/redis/distributed.rb', line 581

def zrank(key, member)
  node_for(key).zrank(key, member)
end

#zrem(key, member) ⇒ Object

Remove one or more members from a sorted set.



560
561
562
# File 'lib/redis/distributed.rb', line 560

def zrem(key, member)
  node_for(key).zrem(key, member)
end

#zremrangebyrank(key, start, stop) ⇒ Object

Remove all members in a sorted set within the given indexes.



592
593
594
# File 'lib/redis/distributed.rb', line 592

def zremrangebyrank(key, start, stop)
  node_for(key).zremrangebyrank(key, start, stop)
end

#zremrangebyscore(key, min, max) ⇒ Object

Remove all members in a sorted set within the given scores.



608
609
610
# File 'lib/redis/distributed.rb', line 608

def zremrangebyscore(key, min, max)
  node_for(key).zremrangebyscore(key, min, max)
end

#zrevrange(key, start, stop, options = {}) ⇒ Object

Return a range of members in a sorted set, by index, with scores ordered from high to low.



576
577
578
# File 'lib/redis/distributed.rb', line 576

def zrevrange(key, start, stop, options = {})
  node_for(key).zrevrange(key, start, stop, options)
end

#zrevrangebyscore(key, max, min, options = {}) ⇒ Object

Return a range of members in a sorted set, by score, with scores ordered from high to low.



603
604
605
# File 'lib/redis/distributed.rb', line 603

def zrevrangebyscore(key, max, min, options = {})
  node_for(key).zrevrangebyscore(key, max, min, options)
end

#zrevrank(key, member) ⇒ Object

Determine the index of a member in a sorted set, with scores ordered from high to low.



587
588
589
# File 'lib/redis/distributed.rb', line 587

def zrevrank(key, member)
  node_for(key).zrevrank(key, member)
end

#zscore(key, member) ⇒ Object

Get the score associated with the given member in a sorted set.



565
566
567
# File 'lib/redis/distributed.rb', line 565

def zscore(key, member)
  node_for(key).zscore(key, member)
end

#zunionstore(destination, keys, options = {}) ⇒ Object

Add multiple sorted sets and store the resulting sorted set in a new key.



626
627
628
629
630
# File 'lib/redis/distributed.rb', line 626

def zunionstore(destination, keys, options = {})
  ensure_same_node(:zunionstore, [destination] + keys) do |node|
    node.zunionstore(destination, keys, options)
  end
end