Class: Redis

Inherits:
Object
  • Object
show all
Includes:
MonitorMixin
Defined in:
lib/redis.rb,
lib/redis/client.rb,
lib/redis/errors.rb,
lib/redis/version.rb,
lib/redis/pipeline.rb,
lib/redis/hash_ring.rb,
lib/redis/subscribe.rb,
lib/redis/distributed.rb

Defined Under Namespace

Classes: BaseConnectionError, BaseError, BasicObject, CannotConnectError, Client, CommandError, ConnectionError, Distributed, Future, FutureNotReady, HashRing, InheritedError, Pipeline, ProtocolError, SubscribedClient, Subscription, TimeoutError

Constant Summary collapse

VERSION =
"3.0.1"

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Redis

Returns a new instance of Redis.



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

def initialize(options = {})
  @client = Client.new(options)

  super() # Monitor#initialize
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(command, *args) ⇒ Object



2188
2189
2190
2191
2192
# File 'lib/redis.rb', line 2188

def method_missing(command, *args)
  synchronize do |client|
    client.call [command, *args]
  end
end

Instance Attribute Details

#clientObject (readonly)

Returns the value of attribute client.



10
11
12
# File 'lib/redis.rb', line 10

def client
  @client
end

Class Method Details

.connect(options = {}) ⇒ Object

Deprecated.

The preferred way to create a new client object is using #new. This method does not actually establish a connection to Redis, in contrary to what you might expect.



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

def self.connect(options = {})
  new(options)
end

.currentObject



19
20
21
# File 'lib/redis.rb', line 19

def self.current
  @current ||= Redis.new
end

.current=(redis) ⇒ Object



23
24
25
# File 'lib/redis.rb', line 23

def self.current=(redis)
  @current = redis
end

.deprecate(message, trace = caller[0]) ⇒ Object



6
7
8
# File 'lib/redis.rb', line 6

def self.deprecate(message, trace = caller[0])
  $stderr.puts "\n#{message} (in #{trace})"
end

Instance Method Details

#_bpop(cmd, args) ⇒ Object



927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
# File 'lib/redis.rb', line 927

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
  timeout = options[:timeout] || 0

  synchronize do |client|
    client.call_without_timeout [cmd, keys, timeout]
  end
end

#_eval(cmd, args) ⇒ Object



2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
# File 'lib/redis.rb', line 2113

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] || []

  synchronize do |client|
    client.call [cmd, script, keys.length] + keys + argv
  end
end

#append(key, value) ⇒ Fixnum

Append a value to a key.

Parameters:

  • key (String)
  • value (String)

    value to append

Returns:

  • (Fixnum)

    length of the string after appending



813
814
815
816
817
# File 'lib/redis.rb', line 813

def append(key, value)
  synchronize do |client|
    client.call [:append, key, value]
  end
end

#auth(password) ⇒ String

Authenticate to the server.

Parameters:

  • password (String)

    must match the password specified in the requirepass directive in the configuration file

Returns:

  • (String)

    OK



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

def auth(password)
  synchronize do |client|
    client.call [:auth, password]
  end
end

#bgrewriteaofString

Asynchronously rewrite the append-only file.

Returns:

  • (String)

    OK



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

def bgrewriteaof
  synchronize do |client|
    client.call [:bgrewriteaof]
  end
end

#bgsaveString

Asynchronously save the dataset to disk.

Returns:

  • (String)

    OK



118
119
120
121
122
# File 'lib/redis.rb', line 118

def bgsave
  synchronize do |client|
    client.call [:bgsave]
  end
end

#blpop(*args) ⇒ nil, [String, String]

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

Examples:

With timeout

list, element = redis.blpop("list", :timeout => 5)
  # => nil on timeout
  # => ["list", "element"] on success

Without timeout

list, element = redis.blpop("list")
  # => ["list", "element"]

Blocking pop on multiple lists

list, element = redis.blpop(["list", "another_list"])
  # => ["list", "element"]

Parameters:

  • keys (String, Array<String>)

    one or more keys to perform the blocking pop on

  • options (Hash)
    • :timeout => Fixnum: timeout in seconds, defaults to no timeout

Returns:

  • (nil, [String, String])
    • nil when the operation timed out
    • tuple of the list that was popped from and element was popped otherwise


971
972
973
# File 'lib/redis.rb', line 971

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

#brpop(*args) ⇒ nil, [String, String]

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

Parameters:

  • keys (String, Array<String>)

    one or more keys to perform the blocking pop on

  • options (Hash)
    • :timeout => Fixnum: timeout in seconds, defaults to no timeout

Returns:

  • (nil, [String, String])
    • nil when the operation timed out
    • tuple of the list that was popped from and element was popped otherwise

See Also:



987
988
989
# File 'lib/redis.rb', line 987

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

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

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

Parameters:

  • source (String)

    source key

  • destination (String)

    destination key

  • options (Hash) (defaults to: {})
    • :timeout => Fixnum: timeout in seconds, defaults to no timeout

Returns:

  • (nil, String)
    • nil when the operation timed out
    • the element was popped and pushed otherwise


1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
# File 'lib/redis.rb', line 1002

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

  timeout = options[:timeout] || 0

  synchronize do |client|
    client.call_without_timeout [:brpoplpush, source, destination, timeout]
  end
end

#config(action, *args) ⇒ String, Hash

Get or set server configuration parameters.

Parameters:

  • action (String)

    e.g. get, set, resetstat

Returns:

  • (String, Hash)

    string reply, or hash when retrieving more than one property with CONFIG GET



129
130
131
132
133
134
135
136
137
138
139
# File 'lib/redis.rb', line 129

def config(action, *args)
  synchronize do |client|
    client.call [:config, action, *args] do |reply|
      if reply.kind_of?(Array) && action == :get
        Hash[*reply]
      else
        reply
      end
    end
  end
end

#dbsizeFixnum

Return the number of keys in the selected database.

Returns:

  • (Fixnum)


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

def dbsize
  synchronize do |client|
    client.call [:dbsize]
  end
end

#debug(*args) ⇒ Object



150
151
152
153
154
# File 'lib/redis.rb', line 150

def debug(*args)
  synchronize do |client|
    client.call [:debug, *args]
  end
end

#decr(key) ⇒ Fixnum

Decrement the integer value of a key by one.

Examples:

redis.decr("value")
  # => 4

Parameters:

  • key (String)

Returns:

  • (Fixnum)

    value after decrementing it



533
534
535
536
537
# File 'lib/redis.rb', line 533

def decr(key)
  synchronize do |client|
    client.call [:decr, key]
  end
end

#decrby(key, decrement) ⇒ Fixnum

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

Examples:

redis.decrby("value", 5)
  # => 0

Parameters:

  • key (String)
  • decrement (Fixnum)

Returns:

  • (Fixnum)

    value after decrementing it



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

def decrby(key, decrement)
  synchronize do |client|
    client.call [:decrby, key, decrement]
  end
end

#del(*keys) ⇒ Fixnum

Delete one or more keys.

Parameters:

  • keys (String, Array<String>)

Returns:

  • (Fixnum)

    number of keys that were deleted



365
366
367
368
369
# File 'lib/redis.rb', line 365

def del(*keys)
  synchronize do |client|
    client.call [:del, *keys]
  end
end

#discardObject

Discard all commands issued after MULTI.

Only call this method when #multi was called without a block.

See Also:



2059
2060
2061
2062
2063
# File 'lib/redis.rb', line 2059

def discard
  synchronize do |client|
    client.call [:discard]
  end
end

#echo(value) ⇒ String

Echo the given string.

Parameters:

  • value (String)

Returns:

  • (String)


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

def echo(value)
  synchronize do |client|
    client.call [:echo, value]
  end
end

#eval(*args) ⇒ Object

Evaluate Lua script.

Examples:

EVAL without KEYS nor ARGV

redis.eval("return 1")
  # => 1

EVAL with KEYS and ARGV as array arguments

redis.eval("return { KEYS, ARGV }", ["k1", "k2"], ["a1", "a2"])
  # => [["k1", "k2"], ["a1", "a2"]]

EVAL with KEYS and ARGV in a hash argument

redis.eval("return { KEYS, ARGV }", :keys => ["k1", "k2"], :argv => ["a1", "a2"])
  # => [["k1", "k2"], ["a1", "a2"]]

Parameters:

  • keys (Array<String>)

    optional array with keys to pass to the script

  • argv (Array<String>)

    optional array with arguments to pass to the script

  • options (Hash)
    • :keys => Array<String>: optional array with keys to pass to the script
    • :argv => Array<String>: optional array with arguments to pass to the script

Returns:

  • depends on the script

See Also:



2147
2148
2149
# File 'lib/redis.rb', line 2147

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

#evalsha(*args) ⇒ Object

Evaluate Lua script by its SHA.

Examples:

EVALSHA without KEYS nor ARGV

redis.evalsha(sha)
  # => <depends on script>

EVALSHA with KEYS and ARGV as array arguments

redis.evalsha(sha, ["k1", "k2"], ["a1", "a2"])
  # => <depends on script>

EVALSHA with KEYS and ARGV in a hash argument

redis.evalsha(sha, :keys => ["k1", "k2"], :argv => ["a1", "a2"])
  # => <depends on script>

Parameters:

  • keys (Array<String>)

    optional array with keys to pass to the script

  • argv (Array<String>)

    optional array with arguments to pass to the script

  • options (Hash)
    • :keys => Array<String>: optional array with keys to pass to the script
    • :argv => Array<String>: optional array with arguments to pass to the script

Returns:

  • depends on the script

See Also:



2172
2173
2174
# File 'lib/redis.rb', line 2172

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

#execnil, Array<...>

Execute all commands issued after MULTI.

Only call this method when #multi was called without a block.

Returns:

  • (nil, Array<...>)
    • when commands were not executed, nil
    • when commands were executed, an array with their replies

See Also:



2045
2046
2047
2048
2049
# File 'lib/redis.rb', line 2045

def exec
  synchronize do |client|
    client.call [:exec]
  end
end

#exists(key) ⇒ Boolean

Determine if a key exists.

Parameters:

  • key (String)

Returns:

  • (Boolean)


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

def exists(key)
  synchronize do |client|
    client.call [:exists, key], &_boolify
  end
end

#expire(key, seconds) ⇒ Boolean

Set a key's time to live in seconds.

Parameters:

  • key (String)
  • seconds (Fixnum)

    time to live

Returns:

  • (Boolean)

    whether the timeout was set or not



300
301
302
303
304
# File 'lib/redis.rb', line 300

def expire(key, seconds)
  synchronize do |client|
    client.call [:expire, key, seconds], &_boolify
  end
end

#expireat(key, unix_time) ⇒ Boolean

Set the expiration for a key as a UNIX timestamp.

Parameters:

  • key (String)
  • unix_time (Fixnum)

    expiry time specified as a UNIX timestamp

Returns:

  • (Boolean)

    whether the timeout was set or not



311
312
313
314
315
# File 'lib/redis.rb', line 311

def expireat(key, unix_time)
  synchronize do |client|
    client.call [:expireat, key, unix_time], &_boolify
  end
end

#flushallString

Remove all keys from all databases.

Returns:

  • (String)

    OK



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

def flushall
  synchronize do |client|
    client.call [:flushall]
  end
end

#flushdbString

Remove all keys from the current database.

Returns:

  • (String)

    OK



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

def flushdb
  synchronize do |client|
    client.call [:flushdb]
  end
end

#get(key) ⇒ String Also known as: []

Get the value of a key.

Parameters:

  • key (String)

Returns:

  • (String)


712
713
714
715
716
# File 'lib/redis.rb', line 712

def get(key)
  synchronize do |client|
    client.call [:get, key]
  end
end

#getbit(key, offset) ⇒ Fixnum

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

Parameters:

  • key (String)
  • offset (Fixnum)

    bit offset

Returns:

  • (Fixnum)

    0 or 1



802
803
804
805
806
# File 'lib/redis.rb', line 802

def getbit(key, offset)
  synchronize do |client|
    client.call [:getbit, key, offset]
  end
end

#getrange(key, start, stop) ⇒ Fixnum

Get a substring of the string stored at a key.

Parameters:

  • key (String)
  • start (Fixnum)

    zero-based start offset

  • stop (Fixnum)

    zero-based end offset. Use -1 for representing the end of the string

Returns:

  • (Fixnum)

    0 or 1



779
780
781
782
783
# File 'lib/redis.rb', line 779

def getrange(key, start, stop)
  synchronize do |client|
    client.call [:getrange, key, start, stop]
  end
end

#getset(key, value) ⇒ String

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

Parameters:

  • key (String)
  • value (String)

    value to replace the current value with

Returns:

  • (String)

    the old value stored in the key, or nil if the key did not exist



825
826
827
828
829
# File 'lib/redis.rb', line 825

def getset(key, value)
  synchronize do |client|
    client.call [:getset, key, value]
  end
end

#hdel(key, field) ⇒ Fixnum

Delete one or more hash fields.

Parameters:

  • key (String)
  • field (String, Array<String>)

Returns:

  • (Fixnum)

    the number of fields that were removed from the hash



1801
1802
1803
1804
1805
# File 'lib/redis.rb', line 1801

def hdel(key, field)
  synchronize do |client|
    client.call [:hdel, key, field]
  end
end

#hexists(key, field) ⇒ Boolean

Determine if a hash field exists.

Parameters:

  • key (String)
  • field (String)

Returns:

  • (Boolean)

    whether or not the field exists in the hash



1812
1813
1814
1815
1816
# File 'lib/redis.rb', line 1812

def hexists(key, field)
  synchronize do |client|
    client.call [:hexists, key, field], &_boolify
  end
end

#hget(key, field) ⇒ String

Get the value of a hash field.

Parameters:

  • key (String)
  • field (String)

Returns:

  • (String)


1748
1749
1750
1751
1752
# File 'lib/redis.rb', line 1748

def hget(key, field)
  synchronize do |client|
    client.call [:hget, key, field]
  end
end

#hgetall(key) ⇒ Hash<String, String>

Get all the fields and values in a hash.

Parameters:

  • key (String)

Returns:

  • (Hash<String, String>)


1868
1869
1870
1871
1872
# File 'lib/redis.rb', line 1868

def hgetall(key)
  synchronize do |client|
    client.call [:hgetall, key], &_hashify
  end
end

#hincrby(key, field, increment) ⇒ Fixnum

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

Parameters:

  • key (String)
  • field (String)
  • increment (Fixnum)

Returns:

  • (Fixnum)

    value of the field after incrementing it



1824
1825
1826
1827
1828
# File 'lib/redis.rb', line 1824

def hincrby(key, field, increment)
  synchronize do |client|
    client.call [:hincrby, key, field, increment]
  end
end

#hincrbyfloat(key, field, increment) ⇒ Float

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

Parameters:

  • key (String)
  • field (String)
  • increment (Float)

Returns:

  • (Float)

    value of the field after incrementing it



1836
1837
1838
1839
1840
1841
1842
# File 'lib/redis.rb', line 1836

def hincrbyfloat(key, field, increment)
  synchronize do |client|
    client.call [:hincrbyfloat, key, field, increment] do |reply|
      Float(reply) if reply
    end
  end
end

#hkeys(key) ⇒ Array<String>

Get all the fields in a hash.

Parameters:

  • key (String)

Returns:

  • (Array<String>)


1848
1849
1850
1851
1852
# File 'lib/redis.rb', line 1848

def hkeys(key)
  synchronize do |client|
    client.call [:hkeys, key]
  end
end

#hlen(key) ⇒ Fixnum

Get the number of fields in a hash.

Parameters:

  • key (String)

Returns:

  • (Fixnum)

    number of fields in the hash



1681
1682
1683
1684
1685
# File 'lib/redis.rb', line 1681

def hlen(key)
  synchronize do |client|
    client.call [:hlen, key]
  end
end

#hmget(key, *fields, &blk) ⇒ Array<String>

Get the values of all the given hash fields.

Examples:

redis.hmget("hash", "f1", "f2")
  # => ["v1", "v2"]

Parameters:

  • key (String)
  • fields (Array<String>)

    array of fields

Returns:

  • (Array<String>)

    an array of values for the specified fields

See Also:



1765
1766
1767
1768
1769
# File 'lib/redis.rb', line 1765

def hmget(key, *fields, &blk)
  synchronize do |client|
    client.call [:hmget, key, *fields], &blk
  end
end

#hmset(key, *attrs) ⇒ Object

Set one or more hash values.

Examples:

redis.hmset("hash", "f1", "v1", "f2", "v2")
  # => "OK"

Parameters:

  • key (String)
  • attrs (Array<String>)

    array of fields and values

See Also:



1722
1723
1724
1725
1726
# File 'lib/redis.rb', line 1722

def hmset(key, *attrs)
  synchronize do |client|
    client.call [:hmset, key, *attrs]
  end
end

#hset(key, field, value) ⇒ Boolean

Set the string value of a hash field.

Parameters:

  • key (String)
  • field (String)
  • value (String)

Returns:

  • (Boolean)

    whether or not the field was added to the hash



1693
1694
1695
1696
1697
# File 'lib/redis.rb', line 1693

def hset(key, field, value)
  synchronize do |client|
    client.call [:hset, key, field, value], &_boolify
  end
end

#hsetnx(key, field, value) ⇒ Boolean

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

Parameters:

  • key (String)
  • field (String)
  • value (String)

Returns:

  • (Boolean)

    whether or not the field was added to the hash



1705
1706
1707
1708
1709
# File 'lib/redis.rb', line 1705

def hsetnx(key, field, value)
  synchronize do |client|
    client.call [:hsetnx, key, field, value], &_boolify
  end
end

#hvals(key) ⇒ Array<String>

Get all the values in a hash.

Parameters:

  • key (String)

Returns:

  • (Array<String>)


1858
1859
1860
1861
1862
# File 'lib/redis.rb', line 1858

def hvals(key)
  synchronize do |client|
    client.call [:hvals, key]
  end
end

#idObject



2176
2177
2178
2179
2180
# File 'lib/redis.rb', line 2176

def id
  synchronize do |client|
    client.id
  end
end

#incr(key) ⇒ Fixnum

Increment the integer value of a key by one.

Examples:

redis.incr("value")
  # => 6

Parameters:

  • key (String)

Returns:

  • (Fixnum)

    value after incrementing it



562
563
564
565
566
# File 'lib/redis.rb', line 562

def incr(key)
  synchronize do |client|
    client.call [:incr, key]
  end
end

#incrby(key, increment) ⇒ Fixnum

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

Examples:

redis.incrby("value", 5)
  # => 10

Parameters:

  • key (String)
  • increment (Fixnum)

Returns:

  • (Fixnum)

    value after incrementing it



577
578
579
580
581
# File 'lib/redis.rb', line 577

def incrby(key, increment)
  synchronize do |client|
    client.call [:incrby, key, increment]
  end
end

#incrbyfloat(key, increment) ⇒ Float

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

Examples:

redis.incrbyfloat("value", 1.23)
  # => 1.23

Parameters:

  • key (String)
  • increment (Float)

Returns:

  • (Float)

    value after incrementing it



592
593
594
595
596
597
598
# File 'lib/redis.rb', line 592

def incrbyfloat(key, increment)
  synchronize do |client|
    client.call [:incrbyfloat, key, increment] do |reply|
      Float(reply) if reply
    end
  end
end

#info(cmd = nil) ⇒ Hash<String, String>

Get information and statistics about the server.

Parameters:

  • cmd (String, Symbol) (defaults to: nil)

    e.g. "commandstats"

Returns:

  • (Hash<String, String>)


178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# File 'lib/redis.rb', line 178

def info(cmd = nil)
  synchronize do |client|
    client.call [:info, cmd].compact do |reply|
      if reply.kind_of?(String)
        reply = Hash[reply.split("\r\n").map do |line|
          line.split(":", 2) unless line =~ /^(#|$)/
        end]

        if cmd && cmd.to_s == "commandstats"
          # Extract nested hashes for INFO COMMANDSTATS
          reply = Hash[reply.map do |k, v|
            [k[/^cmdstat_(.*)$/, 1], Hash[*v.split(/,|=/)]]
          end]
        end
      end

      reply
    end
  end
end

#inspectObject



2182
2183
2184
2185
2186
# File 'lib/redis.rb', line 2182

def inspect
  synchronize do |client|
    "#<Redis client v#{Redis::VERSION} for #{client.id}>"
  end
end

#keys(pattern = "*") ⇒ Array<String>

Find all keys matching the given pattern.

Parameters:

  • pattern (String) (defaults to: "*")

Returns:

  • (Array<String>)


385
386
387
388
389
390
391
392
393
394
395
# File 'lib/redis.rb', line 385

def keys(pattern = "*")
  synchronize do |client|
    client.call [:keys, pattern] do |reply|
      if reply.kind_of?(String)
        reply.split(" ")
      else
        reply
      end
    end
  end
end

#lastsaveFixnum

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

Returns:

  • (Fixnum)


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

def lastsave
  synchronize do |client|
    client.call [:lastsave]
  end
end

#lindex(key, index) ⇒ String

Get an element from a list by its index.

Parameters:

  • key (String)
  • index (Fixnum)

Returns:

  • (String)


1021
1022
1023
1024
1025
# File 'lib/redis.rb', line 1021

def lindex(key, index)
  synchronize do |client|
    client.call [:lindex, key, index]
  end
end

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

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

Parameters:

  • key (String)
  • where (String, Symbol)

    BEFORE or AFTER

  • pivot (String)

    reference element

  • value (String)

Returns:

  • (Fixnum)

    length of the list after the insert operation, or -1 when the element pivot was not found



1035
1036
1037
1038
1039
# File 'lib/redis.rb', line 1035

def linsert(key, where, pivot, value)
  synchronize do |client|
    client.call [:linsert, key, where, pivot, value]
  end
end

#llen(key) ⇒ Fixnum

Get the length of a list.

Parameters:

  • key (String)

Returns:

  • (Fixnum)


846
847
848
849
850
# File 'lib/redis.rb', line 846

def llen(key)
  synchronize do |client|
    client.call [:llen, key]
  end
end

#lpop(key) ⇒ String

Remove and get the first element in a list.

Parameters:

  • key (String)

Returns:

  • (String)


900
901
902
903
904
# File 'lib/redis.rb', line 900

def lpop(key)
  synchronize do |client|
    client.call [:lpop, key]
  end
end

#lpush(key, value) ⇒ Fixnum

Prepend one or more values to a list, creating the list if it doesn't exist

Parameters:

  • key (String)
  • value (String)

Returns:

  • (Fixnum)

    the length of the list after the push operation



857
858
859
860
861
# File 'lib/redis.rb', line 857

def lpush(key, value)
  synchronize do |client|
    client.call [:lpush, key, value]
  end
end

#lpushx(key, value) ⇒ Fixnum

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

Parameters:

  • key (String)
  • value (String)

Returns:

  • (Fixnum)

    the length of the list after the push operation



868
869
870
871
872
# File 'lib/redis.rb', line 868

def lpushx(key, value)
  synchronize do |client|
    client.call [:lpushx, key, value]
  end
end

#lrange(key, start, stop) ⇒ Array<String>

Get a range of elements from a list.

Parameters:

  • key (String)
  • start (Fixnum)

    start index

  • stop (Fixnum)

    stop index

Returns:

  • (Array<String>)


1047
1048
1049
1050
1051
# File 'lib/redis.rb', line 1047

def lrange(key, start, stop)
  synchronize do |client|
    client.call [:lrange, key, start, stop]
  end
end

#lrem(key, count, value) ⇒ Fixnum

Remove elements from a list.

Parameters:

  • key (String)
  • count (Fixnum)

    number of elements to remove. Use a positive value to remove the first count occurrences of value. A negative value to remove the last count occurrences of value. Or zero, to remove all occurrences of value from the list.

  • value (String)

Returns:

  • (Fixnum)

    the number of removed elements



1062
1063
1064
1065
1066
# File 'lib/redis.rb', line 1062

def lrem(key, count, value)
  synchronize do |client|
    client.call [:lrem, key, count, value]
  end
end

#lset(key, index, value) ⇒ String

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

Parameters:

  • key (String)
  • index (Fixnum)
  • value (String)

Returns:

  • (String)

    OK



1074
1075
1076
1077
1078
# File 'lib/redis.rb', line 1074

def lset(key, index, value)
  synchronize do |client|
    client.call [:lset, key, index, value]
  end
end

#ltrim(key, start, stop) ⇒ String

Trim a list to the specified range.

Parameters:

  • key (String)
  • start (Fixnum)

    start index

  • stop (Fixnum)

    stop index

Returns:

  • (String)

    OK



1086
1087
1088
1089
1090
# File 'lib/redis.rb', line 1086

def ltrim(key, start, stop)
  synchronize do |client|
    client.call [:ltrim, key, start, stop]
  end
end

#mapped_hmget(key, *fields) ⇒ Hash

Get the values of all the given hash fields.

Examples:

redis.hmget("hash", "f1", "f2")
  # => { "f1" => "v1", "f2" => "v2" }

Parameters:

  • key (String)
  • fields (Array<String>)

    array of fields

Returns:

  • (Hash)

    a hash mapping the specified fields to their values

See Also:



1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
# File 'lib/redis.rb', line 1782

def mapped_hmget(key, *fields)
  hmget(key, *fields) do |reply|
    if reply.kind_of?(Array)
      hash = Hash.new
      fields.zip(reply).each do |field, value|
        hash[field] = value
      end
      hash
    else
      reply
    end
  end
end

#mapped_hmset(key, hash) ⇒ Object

Set one or more hash values.

Examples:

redis.mapped_hmset("hash", { "f1" => "v1", "f2" => "v2" })
  # => "OK"

Parameters:

  • key (String)
  • hash (Hash)

    fields mapping to values

See Also:



1739
1740
1741
# File 'lib/redis.rb', line 1739

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

#mapped_mget(*keys) ⇒ Hash

Get the values of all the given keys.

Examples:

redis.mapped_mget("key1", "key1")
  # => { "key1" => "v1", "key2" => "v2" }

Parameters:

  • keys (Array<String>)

    array of keys

Returns:

  • (Hash)

    a hash mapping the specified keys to their values

See Also:



746
747
748
749
750
751
752
753
754
755
756
757
758
# File 'lib/redis.rb', line 746

def mapped_mget(*keys)
  mget(*keys) do |reply|
    if reply.kind_of?(Array)
      hash = Hash.new
      keys.zip(reply).each do |field, value|
        hash[field] = value
      end
      hash
    else
      reply
    end
  end
end

#mapped_mset(hash) ⇒ Object

Set one or more values.

Examples:

redis.mapped_mset({ "f1" => "v1", "f2" => "v2" })
  # => "OK"

Parameters:

  • hash (Hash)

    keys mapping to values

See Also:



674
675
676
# File 'lib/redis.rb', line 674

def mapped_mset(hash)
  mset(*hash.to_a.flatten)
end

#mapped_msetnx(hash) ⇒ Boolean

Set one or more values, only if none of the keys exist.

Examples:

redis.msetnx({ "key1" => "v1", "key2" => "v2" })
  # => true

Parameters:

  • hash (Hash)

    keys mapping to values

Returns:

  • (Boolean)

    whether or not all values were set

See Also:



704
705
706
# File 'lib/redis.rb', line 704

def mapped_msetnx(hash)
  msetnx(*hash.to_a.flatten)
end

#mget(*keys, &blk) ⇒ Array<String>

Get the values of all the given keys.

Examples:

redis.mget("key1", "key1")
  # => ["v1", "v2"]

Parameters:

  • keys (Array<String>)

Returns:

  • (Array<String>)

    an array of values for the specified keys

See Also:



730
731
732
733
734
# File 'lib/redis.rb', line 730

def mget(*keys, &blk)
  synchronize do |client|
    client.call [:mget, *keys], &blk
  end
end

#monitor {|line| ... } ⇒ Object

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

There is no way to interrupt this command.

Yields:

  • a block to be called for every line of output

Yield Parameters:

  • line (String)

    timestamp and command that was executed



214
215
216
217
218
# File 'lib/redis.rb', line 214

def monitor(&block)
  synchronize do |client|
    client.call_loop([:monitor], &block)
  end
end

#move(key, db) ⇒ Boolean

Move a key to another database.

Examples:

Move a key to another database

redis.set "foo", "bar"
  # => "OK"
redis.move "foo", 2
  # => true
redis.exists "foo"
  # => false
redis.select 2
  # => "OK"
redis.exists "foo"
  # => true
resis.get "foo"
  # => "bar"

Parameters:

  • key (String)
  • db (Fixnum)

Returns:

  • (Boolean)

    whether the key was moved or not



416
417
418
419
420
# File 'lib/redis.rb', line 416

def move(key, db)
  synchronize do |client|
    client.call [:move, key, db], &_boolify
  end
end

#mset(*args) ⇒ Object

Set one or more values.

Examples:

redis.mset("key1", "v1", "key2", "v2")
  # => "OK"

Parameters:

  • args (Array<String>)

    array of keys and values

See Also:



658
659
660
661
662
# File 'lib/redis.rb', line 658

def mset(*args)
  synchronize do |client|
    client.call [:mset, *args]
  end
end

#msetnx(*args) ⇒ Boolean

Set one or more values, only if none of the keys exist.

Examples:

redis.msetnx("key1", "v1", "key2", "v2")
  # => true

Parameters:

  • args (Array<String>)

    array of keys and values

Returns:

  • (Boolean)

    whether or not all values were set

See Also:



688
689
690
691
692
# File 'lib/redis.rb', line 688

def msetnx(*args)
  synchronize do |client|
    client.call [:msetnx, *args], &_boolify
  end
end

#multi {|multi| ... } ⇒ String, Array<...>

Mark the start of a transaction block.

Passing a block is optional.

Examples:

With a block

redis.multi do |multi|
  multi.set("key", "value")
  multi.incr("counter")
end # => ["OK", 6]

Without a block

redis.multi
  # => "OK"
redis.set("key", "value")
  # => "QUEUED"
redis.incr("counter")
  # => "QUEUED"
redis.exec
  # => ["OK", 6]

Yields:

  • (multi)

    the commands that are called inside this block are cached and written to the server upon returning from it

Yield Parameters:

Returns:

  • (String, Array<...>)
    • when a block is not given, OK
    • when a block is given, an array with replies

See Also:



2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
# File 'lib/redis.rb', line 2018

def multi
  synchronize do |client|
    if !block_given?
      client.call [:multi]
    else
      begin
        pipeline = Pipeline::Multi.new
        original, @client = @client, pipeline
        yield(self)
        original.call_pipeline(pipeline)
      ensure
        @client = original
      end
    end
  end
end

#object(*args) ⇒ Object



422
423
424
425
426
# File 'lib/redis.rb', line 422

def object(*args)
  synchronize do |client|
    client.call [:object, *args]
  end
end

#persist(key) ⇒ Boolean

Remove the expiration from a key.

Parameters:

  • key (String)

Returns:

  • (Boolean)

    whether the timeout was removed or not



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

def persist(key)
  synchronize do |client|
    client.call [:persist, key], &_boolify
  end
end

#pexpire(key, milliseconds) ⇒ Boolean

Set a key's time to live in milliseconds.

Parameters:

  • key (String)
  • milliseconds (Fixnum)

    time to live

Returns:

  • (Boolean)

    whether the timeout was set or not



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

def pexpire(key, milliseconds)
  synchronize do |client|
    client.call [:pexpire, key, milliseconds], &_boolify
  end
end

#pexpireat(key, ms_unix_time) ⇒ Boolean

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

Parameters:

  • key (String)
  • ms_unix_time (Fixnum)

    expiry time specified as number of milliseconds from UNIX Epoch.

Returns:

  • (Boolean)

    whether the timeout was set or not



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

def pexpireat(key, ms_unix_time)
  synchronize do |client|
    client.call [:pexpireat, key, ms_unix_time], &_boolify
  end
end

#pingString

Ping the server.

Returns:

  • (String)

    PONG



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

def ping
  synchronize do |client|
    client.call [:ping]
  end
end

#pipelinedObject



1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
# File 'lib/redis.rb', line 1976

def pipelined
  synchronize do |client|
    begin
      original, @client = @client, Pipeline.new
      yield(self)
      original.call_pipeline(@client)
    ensure
      @client = original
    end
  end
end

#psetex(key, ttl, value) ⇒ Object

Set the time to live in milliseconds of a key.

Parameters:

  • key (String)
  • ttl (Fixnum)
  • value (String)


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

def psetex(key, ttl, value)
  synchronize do |client|
    client.call [:psetex, key, ttl, value]
  end
end

#psubscribe(*channels, &block) ⇒ Object

Listen for messages published to channels matching the given patterns.



1903
1904
1905
1906
1907
# File 'lib/redis.rb', line 1903

def psubscribe(*channels, &block)
  synchronize do |client|
    _subscription(:psubscribe, channels, block)
  end
end

#pttl(key) ⇒ Fixnum

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

Parameters:

  • key (String)

Returns:

  • (Fixnum)

    remaining time to live in milliseconds, or -1 if the key does not exist or does not have a timeout



355
356
357
358
359
# File 'lib/redis.rb', line 355

def pttl(key)
  synchronize do |client|
    client.call [:pttl, key]
  end
end

#publish(channel, message) ⇒ Object

Post a message to a channel.



1875
1876
1877
1878
1879
# File 'lib/redis.rb', line 1875

def publish(channel, message)
  synchronize do |client|
    client.call [:publish, channel, message]
  end
end

#punsubscribe(*channels) ⇒ Object

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



1910
1911
1912
1913
1914
1915
# File 'lib/redis.rb', line 1910

def punsubscribe(*channels)
  synchronize do |client|
    raise RuntimeError, "Can't unsubscribe if not subscribed." unless subscribed?
    client.punsubscribe(*channels)
  end
end

#quitString

Close the connection.

Returns:

  • (String)

    OK



95
96
97
98
99
100
101
102
103
104
# File 'lib/redis.rb', line 95

def quit
  synchronize do |client|
    begin
      client.call [:quit]
    rescue ConnectionError
    ensure
      client.disconnect
    end
  end
end

#randomkeyString

Return a random key from the keyspace.

Returns:

  • (String)


431
432
433
434
435
# File 'lib/redis.rb', line 431

def randomkey
  synchronize do |client|
    client.call [:randomkey]
  end
end

#rename(old_name, new_name) ⇒ String

Rename a key. If the new key already exists it is overwritten.

Parameters:

  • old_name (String)
  • new_name (String)

Returns:

  • (String)

    OK



442
443
444
445
446
# File 'lib/redis.rb', line 442

def rename(old_name, new_name)
  synchronize do |client|
    client.call [:rename, old_name, new_name]
  end
end

#renamenx(old_name, new_name) ⇒ Boolean

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

Parameters:

  • old_name (String)
  • new_name (String)

Returns:

  • (Boolean)

    whether the key was renamed or not



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

def renamenx(old_name, new_name)
  synchronize do |client|
    client.call [:renamenx, old_name, new_name], &_boolify
  end
end

#rpop(key) ⇒ String

Remove and get the last element in a list.

Parameters:

  • key (String)

Returns:

  • (String)


910
911
912
913
914
# File 'lib/redis.rb', line 910

def rpop(key)
  synchronize do |client|
    client.call [:rpop, key]
  end
end

#rpoplpush(source, destination) ⇒ nil, String

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

Parameters:

  • source (String)

    source key

  • destination (String)

    destination key

Returns:

  • (nil, String)

    the element, or nil when the source key does not exist



921
922
923
924
925
# File 'lib/redis.rb', line 921

def rpoplpush(source, destination)
  synchronize do |client|
    client.call [:rpoplpush, source, destination]
  end
end

#rpush(key, value) ⇒ Fixnum

Append one or more values to a list, creating the list if it doesn't exist

Parameters:

  • key (String)
  • value (String)

Returns:

  • (Fixnum)

    the length of the list after the push operation



879
880
881
882
883
# File 'lib/redis.rb', line 879

def rpush(key, value)
  synchronize do |client|
    client.call [:rpush, key, value]
  end
end

#rpushx(key, value) ⇒ Fixnum

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

Parameters:

  • key (String)
  • value (String)

Returns:

  • (Fixnum)

    the length of the list after the push operation



890
891
892
893
894
# File 'lib/redis.rb', line 890

def rpushx(key, value)
  synchronize do |client|
    client.call [:rpushx, key, value]
  end
end

#sadd(key, member) ⇒ Boolean, Fixnum

Add one or more members to a set.

Parameters:

  • key (String)
  • member (String, Array<String>)

    one member, or array of members

Returns:

  • (Boolean, Fixnum)

    Boolean when a single member is specified, holding whether or not adding the member succeeded, or Fixnum when an array of members is specified, holding the number of members that were successfully added



1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
# File 'lib/redis.rb', line 1110

def sadd(key, member)
  synchronize do |client|
    client.call [:sadd, key, member] do |reply|
      if member.is_a? Array
        # Variadic: return integer
        reply
      else
        # Single argument: return boolean
        _boolify.call(reply)
      end
    end
  end
end

#saveString

Synchronously save the dataset to disk.

Returns:

  • (String)


223
224
225
226
227
# File 'lib/redis.rb', line 223

def save
  synchronize do |client|
    client.call [:save]
  end
end

#scard(key) ⇒ Fixnum

Get the number of members in a set.

Parameters:

  • key (String)

Returns:

  • (Fixnum)


1096
1097
1098
1099
1100
# File 'lib/redis.rb', line 1096

def scard(key)
  synchronize do |client|
    client.call [:scard, key]
  end
end

#script(subcommand, *args) ⇒ String, ...

Control remote script registry.

Examples:

Load a script

sha = redis.script(:load, "return 1")
  # => <sha of this script>

Check if a script exists

redis.script(:exists, sha)
  # => true

Check if multiple scripts exist

redis.script(:exists, [sha, other_sha])
  # => [true, false]

Flush the script registry

redis.script(:flush)
  # => "OK"

Kill a running script

redis.script(:kill)
  # => "OK"

Parameters:

  • subcommand (String)

    e.g. exists, flush, load, kill

  • args (Array<String>)

    depends on subcommand

Returns:

  • (String, Boolean, Array<Boolean>, ...)

    depends on subcommand

See Also:



2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
# File 'lib/redis.rb', line 2089

def script(subcommand, *args)
  subcommand = subcommand.to_s.downcase

  if subcommand == "exists"
    synchronize do |client|
      arg = args.first

      client.call [:script, :exists, arg] do |reply|
        reply = reply.map { |r| _boolify.call(r) }

        if arg.is_a?(Array)
          reply
        else
          reply.first
        end
      end
    end
  else
    synchronize do |client|
      client.call [:script, subcommand] + args
    end
  end
end

#sdiff(*keys) ⇒ Array<String>

Subtract multiple sets.

Parameters:

  • keys (String, Array<String>)

    keys pointing to sets to subtract

Returns:

  • (Array<String>)

    members in the difference



1203
1204
1205
1206
1207
# File 'lib/redis.rb', line 1203

def sdiff(*keys)
  synchronize do |client|
    client.call [:sdiff, *keys]
  end
end

#sdiffstore(destination, *keys) ⇒ Fixnum

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

Parameters:

  • destination (String)

    destination key

  • keys (String, Array<String>)

    keys pointing to sets to subtract

Returns:

  • (Fixnum)

    number of elements in the resulting set



1214
1215
1216
1217
1218
# File 'lib/redis.rb', line 1214

def sdiffstore(destination, *keys)
  synchronize do |client|
    client.call [:sdiffstore, destination, *keys]
  end
end

#select(db) ⇒ String

Change the selected database for the current connection.

Parameters:

  • db (Fixnum)

    zero-based index of the DB to use (0 to 15)

Returns:

  • (String)

    OK



66
67
68
69
70
71
# File 'lib/redis.rb', line 66

def select(db)
  synchronize do |client|
    client.db = db
    client.call [:select, db]
  end
end

#set(key, value) ⇒ Object Also known as: []=

Set the string value of a key.

Parameters:

  • key (String)
  • value (String)


605
606
607
608
609
# File 'lib/redis.rb', line 605

def set(key, value)
  synchronize do |client|
    client.call [:set, key, value]
  end
end

#setbit(key, offset, value) ⇒ Fixnum

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

Parameters:

  • key (String)
  • offset (Fixnum)

    bit offset

  • value (Fixnum)

    bit value 0 or 1

Returns:

  • (Fixnum)

    the original bit value stored at offset



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

def setbit(key, offset, value)
  synchronize do |client|
    client.call [:setbit, key, offset, value]
  end
end

#setex(key, ttl, value) ⇒ Object

Set the time to live in seconds of a key.

Parameters:

  • key (String)
  • ttl (Fixnum)
  • value (String)


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

def setex(key, ttl, value)
  synchronize do |client|
    client.call [:setex, key, ttl, value]
  end
end

#setnx(key, value) ⇒ Boolean

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

Parameters:

  • key (String)
  • value (String)

Returns:

  • (Boolean)

    whether the key was set or not



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

def setnx(key, value)
  synchronize do |client|
    client.call [:setnx, key, value], &_boolify
  end
end

#setrange(key, offset, value) ⇒ Fixnum

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

Parameters:

  • key (String)
  • offset (Fixnum)

    byte offset

  • value (String)

Returns:

  • (Fixnum)

    length of the string after it was modified



766
767
768
769
770
# File 'lib/redis.rb', line 766

def setrange(key, offset, value)
  synchronize do |client|
    client.call [:setrange, key, offset, value]
  end
end

#shutdownObject

Synchronously save the dataset to disk and then shut down the server.



230
231
232
233
234
235
236
237
238
239
240
241
# File 'lib/redis.rb', line 230

def shutdown
  synchronize do |client|
    client.with_reconnect(false) do
      begin
        client.call [:shutdown]
      rescue ConnectionError
        # This means Redis has probably exited.
        nil
      end
    end
  end
end

#sinter(*keys) ⇒ Array<String>

Intersect multiple sets.

Parameters:

  • keys (String, Array<String>)

    keys pointing to sets to intersect

Returns:

  • (Array<String>)

    members in the intersection



1224
1225
1226
1227
1228
# File 'lib/redis.rb', line 1224

def sinter(*keys)
  synchronize do |client|
    client.call [:sinter, *keys]
  end
end

#sinterstore(destination, *keys) ⇒ Fixnum

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

Parameters:

  • destination (String)

    destination key

  • keys (String, Array<String>)

    keys pointing to sets to intersect

Returns:

  • (Fixnum)

    number of elements in the resulting set



1235
1236
1237
1238
1239
# File 'lib/redis.rb', line 1235

def sinterstore(destination, *keys)
  synchronize do |client|
    client.call [:sinterstore, destination, *keys]
  end
end

#sismember(key, member) ⇒ Boolean

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

Parameters:

  • key (String)
  • member (String)

Returns:

  • (Boolean)


1183
1184
1185
1186
1187
# File 'lib/redis.rb', line 1183

def sismember(key, member)
  synchronize do |client|
    client.call [:sismember, key, member], &_boolify
  end
end

#slaveof(host, port) ⇒ Object

Make the server a slave of another instance, or promote it as master.



244
245
246
247
248
# File 'lib/redis.rb', line 244

def slaveof(host, port)
  synchronize do |client|
    client.call [:slaveof, host, port]
  end
end

#slowlog(subcommand, length = nil) ⇒ Array<String>, ...

Interact with the slowlog (get, len, reset)

Parameters:

  • subcommand (String)

    e.g. get, len, reset

  • length (Fixnum) (defaults to: nil)

    maximum number of entries to return

Returns:

  • (Array<String>, Fixnum, String)

    depends on subcommand



255
256
257
258
259
260
261
# File 'lib/redis.rb', line 255

def slowlog(subcommand, length=nil)
  synchronize do |client|
    args = [:slowlog, subcommand]
    args << length if length
    client.call args
  end
end

#smembers(key) ⇒ Array<String>

Get all the members in a set.

Parameters:

  • key (String)

Returns:

  • (Array<String>)


1193
1194
1195
1196
1197
# File 'lib/redis.rb', line 1193

def smembers(key)
  synchronize do |client|
    client.call [:smembers, key]
  end
end

#smove(source, destination, member) ⇒ Boolean

Move a member from one set to another.

Parameters:

  • source (String)

    source key

  • destination (String)

    destination key

  • member (String)

    member to move from source to destination

Returns:

  • (Boolean)


1172
1173
1174
1175
1176
# File 'lib/redis.rb', line 1172

def smove(source, destination, member)
  synchronize do |client|
    client.call [:smove, source, destination, member], &_boolify
  end
end

#sort(key, options = {}) ⇒ Array<String>, ...

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

Examples:

Retrieve the first 2 elements from an alphabetically sorted "list"

redis.sort("list", :order => "alpha", :limit => [0, 2])
  # => ["a", "b"]

Store an alphabetically descending list in "target"

redis.sort("list", :order => "desc alpha", :store => "target")
  # => 26

Parameters:

  • key (String)
  • options (Hash) (defaults to: {})
    • :by => String: use external key to sort elements by
    • :limit => [offset, count]: skip offset elements, return a maximum of count elements
    • :get => [String, Array<String>]: single key or array of keys to retrieve per element in the result
    • :order => String: combination of ASC, DESC and optionally ALPHA
    • :store => String: key to store the result at

Returns:

  • (Array<String>, Array<Array<String>>, Fixnum)
    • when :get is not specified, or holds a single element, an array of elements
    • when :get is specified, and holds more than one element, an array of elements where every element is an array with the result for every element specified in :get
    • when :store is specified, the number of elements in the stored result


484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
# File 'lib/redis.rb', line 484

def sort(key, options = {})
  args = []

  by = options[:by]
  args.concat ["BY", by] if by

  limit = options[:limit]
  args.concat ["LIMIT", *limit] if limit

  get = Array(options[:get])
  args.concat ["GET"].product(get).flatten unless get.empty?

  order = options[:order]
  args.concat order.split(" ") if order

  store = options[:store]
  args.concat ["STORE", store] if store

  synchronize do |client|
    client.call [:sort, key, *args] do |reply|
      if get.size > 1
        if reply
          reply.each_slice(get.size).to_a
        end
      else
        reply
      end
    end
  end
end

#spop(key) ⇒ String

Remove and return a random member from a set.

Parameters:

  • key (String)

Returns:

  • (String)


1150
1151
1152
1153
1154
# File 'lib/redis.rb', line 1150

def spop(key)
  synchronize do |client|
    client.call [:spop, key]
  end
end

#srandmember(key) ⇒ String

Get a random member from a set.

Parameters:

  • key (String)

Returns:

  • (String)


1160
1161
1162
1163
1164
# File 'lib/redis.rb', line 1160

def srandmember(key)
  synchronize do |client|
    client.call [:srandmember, key]
  end
end

#srem(key, member) ⇒ Boolean, Fixnum

Remove one or more members from a set.

Parameters:

  • key (String)
  • member (String, Array<String>)

    one member, or array of members

Returns:

  • (Boolean, Fixnum)

    Boolean when a single member is specified, holding whether or not removing the member succeeded, or Fixnum when an array of members is specified, holding the number of members that were successfully removed



1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
# File 'lib/redis.rb', line 1132

def srem(key, member)
  synchronize do |client|
    client.call [:srem, key, member] do |reply|
      if member.is_a? Array
        # Variadic: return integer
        reply
      else
        # Single argument: return boolean
        _boolify.call(reply)
      end
    end
  end
end

#strlen(key) ⇒ Fixnum

Get the length of the value stored in a key.

Parameters:

  • key (String)

Returns:

  • (Fixnum)

    the length of the value stored in the key, or 0 if the key does not exist



836
837
838
839
840
# File 'lib/redis.rb', line 836

def strlen(key)
  synchronize do |client|
    client.call [:strlen, key]
  end
end

#subscribe(*channels, &block) ⇒ Object

Listen for messages published to the given channels.



1888
1889
1890
1891
1892
# File 'lib/redis.rb', line 1888

def subscribe(*channels, &block)
  synchronize do |client|
    _subscription(:subscribe, channels, block)
  end
end

#subscribed?Boolean

Returns:

  • (Boolean)


1881
1882
1883
1884
1885
# File 'lib/redis.rb', line 1881

def subscribed?
  synchronize do |client|
    client.kind_of? SubscribedClient
  end
end

#sunion(*keys) ⇒ Array<String>

Add multiple sets.

Parameters:

  • keys (String, Array<String>)

    keys pointing to sets to unify

Returns:

  • (Array<String>)

    members in the union



1245
1246
1247
1248
1249
# File 'lib/redis.rb', line 1245

def sunion(*keys)
  synchronize do |client|
    client.call [:sunion, *keys]
  end
end

#sunionstore(destination, *keys) ⇒ Fixnum

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

Parameters:

  • destination (String)

    destination key

  • keys (String, Array<String>)

    keys pointing to sets to unify

Returns:

  • (Fixnum)

    number of elements in the resulting set



1256
1257
1258
1259
1260
# File 'lib/redis.rb', line 1256

def sunionstore(destination, *keys)
  synchronize do |client|
    client.call [:sunionstore, destination, *keys]
  end
end

#syncObject

Internal command used for replication.



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

def sync
  synchronize do |client|
    client.call [:sync]
  end
end

#synchronizeObject



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

def synchronize
  mon_synchronize { yield(@client) }
end

#timeArray<Fixnum>

Return the server time.

Examples:

r.time # => [ 1333093196, 606806 ]

Returns:

  • (Array<Fixnum>)

    tuple of seconds since UNIX epoch and microseconds in the current second



277
278
279
280
281
282
283
# File 'lib/redis.rb', line 277

def time
  synchronize do |client|
    client.call [:time] do |reply|
      reply.map(&:to_i) if reply
    end
  end
end

#ttl(key) ⇒ Fixnum

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

Parameters:

  • key (String)

Returns:

  • (Fixnum)

    remaining time to live in seconds, or -1 if the key does not exist or does not have a timeout



322
323
324
325
326
# File 'lib/redis.rb', line 322

def ttl(key)
  synchronize do |client|
    client.call [:ttl, key]
  end
end

#type(key) ⇒ String

Determine the type stored at key.

Parameters:

  • key (String)

Returns:

  • (String)

    string, list, set, zset, hash or none



519
520
521
522
523
# File 'lib/redis.rb', line 519

def type(key)
  synchronize do |client|
    client.call [:type, key]
  end
end

#unsubscribe(*channels) ⇒ Object

Stop listening for messages posted to the given channels.



1895
1896
1897
1898
1899
1900
# File 'lib/redis.rb', line 1895

def unsubscribe(*channels)
  synchronize do |client|
    raise RuntimeError, "Can't unsubscribe if not subscribed." unless subscribed?
    client.unsubscribe(*channels)
  end
end

#unwatchString

Forget about all watched keys.

Returns:

  • (String)

    OK

See Also:



1970
1971
1972
1973
1974
# File 'lib/redis.rb', line 1970

def unwatch
  synchronize do |client|
    client.call [:unwatch]
  end
end

#watch(*keys) ⇒ Object, String

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

Using a block is optional, but is necessary for thread-safety.

An #unwatch is automatically issued if an exception is raised within the block that is a subclass of StandardError and is not a ConnectionError.

Examples:

With a block

redis.watch("key") do
  if redis.get("key") == "some value"
    redis.multi do |multi|
      multi.set("key", "other value")
      multi.incr("counter")
    end
  else
    redis.unwatch
  end
end
  # => ["OK", 6]

Without a block

redis.watch("key")
  # => "OK"

Parameters:

  • keys (String, Array<String>)

    one or more keys to watch

Returns:

  • (Object)

    if using a block, returns the return value of the block

  • (String)

    if not using a block, returns OK

See Also:



1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
# File 'lib/redis.rb', line 1947

def watch(*keys)
  synchronize do |client|
    client.call [:watch, *keys]

    if block_given?
      begin
        yield
      rescue ConnectionError
        raise
      rescue StandardError
        unwatch
        raise
      end
    end
  end
end

#with_reconnect(val = true, &blk) ⇒ Object

Run code with the client reconnecting



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

def with_reconnect(val=true, &blk)
  synchronize do |client|
    client.with_reconnect(val, &blk)
  end
end

#without_reconnect(&blk) ⇒ Object

Run code without the client reconnecting



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

def without_reconnect(&blk)
  with_reconnect(false, &blk)
end

#zadd(key, *args) ⇒ Boolean, Fixnum

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

Examples:

Add a single [score, member] pair to a sorted set

redis.zadd("zset", 32.0, "member")

Add an array of [score, member] pairs to a sorted set

redis.zadd("zset", [[32.0, "a"], [64.0, "b"]])

Parameters:

  • key (String)
  • args ([Float, String], Array<[Float, String]>)
    • a single [score, member] pair
    • an array of [score, member] pairs

Returns:

  • (Boolean, Fixnum)
    • Boolean when a single pair is specified, holding whether or not it was added to the sorted set
    • Fixnum when an array of pairs is specified, holding the number of pairs that were added to the sorted set


1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
# File 'lib/redis.rb', line 1294

def zadd(key, *args)
  synchronize do |client|
    if args.size == 1 && args[0].is_a?(Array)
      # Variadic: return integer
      client.call [:zadd, key] + args[0]
    elsif args.size == 2
      # Single pair: return boolean
      client.call [:zadd, key, args[0], args[1]], &_boolify
    else
      raise ArgumentError, "wrong number of arguments"
    end
  end
end

#zcard(key) ⇒ Fixnum

Get the number of members in a sorted set.

Examples:

redis.zcard("zset")
  # => 4

Parameters:

  • key (String)

Returns:

  • (Fixnum)


1270
1271
1272
1273
1274
# File 'lib/redis.rb', line 1270

def zcard(key)
  synchronize do |client|
    client.call [:zcard, key]
  end
end

#zcount(key, min, max) ⇒ Fixnum

Count the members in a sorted set with scores within the given values.

Examples:

Count members with score >= 5 and < 100

redis.zcount("zset", "5", "(100")
  # => 2

Count members with scores > 5

redis.zcount("zset", "(5", "+inf")
  # => 2

Parameters:

  • key (String)
  • min (String)
    • inclusive minimum score is specified verbatim
    • exclusive minimum score is specified by prefixing (
  • max (String)
    • inclusive maximum score is specified verbatim
    • exclusive maximum score is specified by prefixing (

Returns:

  • (Fixnum)

    number of members in within the specified range



1616
1617
1618
1619
1620
# File 'lib/redis.rb', line 1616

def zcount(key, min, max)
  synchronize do |client|
    client.call [:zcount, key, min, max]
  end
end

#zincrby(key, increment, member) ⇒ Float

Increment the score of a member in a sorted set.

Examples:

redis.zincrby("zset", 32.0, "a")
  # => 64.0

Parameters:

  • key (String)
  • increment (Float)
  • member (String)

Returns:

  • (Float)

    score of the member after incrementing it



1318
1319
1320
1321
1322
1323
1324
# File 'lib/redis.rb', line 1318

def zincrby(key, increment, member)
  synchronize do |client|
    client.call [:zincrby, key, increment, member] do |reply|
      Float(reply) if reply
    end
  end
end

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

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

Examples:

Compute the intersection of 2*zsetA with 1*zsetB, summing their scores

redis.zinterstore("zsetC", ["zsetA", "zsetB"], :weights => [2.0, 1.0], :aggregate => "sum")
  # => 4

Parameters:

  • destination (String)

    destination key

  • keys (Array<String>)

    source keys

  • options (Hash) (defaults to: {})
    • :weights => [Float, Float, ...]: weights to associate with source sorted sets
    • :aggregate => String: aggregate function to use (sum, min, max, ...)

Returns:

  • (Fixnum)

    number of elements in the resulting sorted set



1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
# File 'lib/redis.rb', line 1636

def zinterstore(destination, keys, options = {})
  args = []

  weights = options[:weights]
  args.concat ["WEIGHTS", *weights] if weights

  aggregate = options[:aggregate]
  args.concat ["AGGREGATE", aggregate] if aggregate

  synchronize do |client|
    client.call [:zinterstore, destination, keys.size, *(keys + args)]
  end
end

#zrange(key, start, stop, options = {}) ⇒ Array<String>, Array<[String, Float]>

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

Examples:

Retrieve all members from a sorted set

redis.zrange("zset", 0, -1)
  # => ["a", "b"]

Retrieve all members and their scores from a sorted set

redis.zrange("zset", 0, -1, :with_scores => true)
  # => [["a", 32.0], ["b", 64.0]]

Parameters:

  • key (String)
  • start (Fixnum)

    start index

  • stop (Fixnum)

    stop index

  • options (Hash) (defaults to: {})
    • :with_scores => true: include scores in output

Returns:

  • (Array<String>, Array<[String, Float]>)
    • when :with_scores is not specified, an array of members
    • when :with_scores is specified, an array with [member, score] pairs


1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
# File 'lib/redis.rb', line 1392

def zrange(key, start, stop, options = {})
  args = []

  with_scores = options[:with_scores] || options[:withscores]
  args << "WITHSCORES" if with_scores

  synchronize do |client|
    client.call [:zrange, key, start, stop, *args] do |reply|
      if with_scores
        if reply
          reply.each_slice(2).map do |member, score|
            [member, Float(score)]
          end
        end
      else
        reply
      end
    end
  end
end

#zrangebyscore(key, min, max, options = {}) ⇒ Array<String>, Array<[String, Float]>

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

Examples:

Retrieve members with score >= 5 and < 100

redis.zrangebyscore("zset", "5", "(100")
  # => ["a", "b"]

Retrieve the first 2 members with score >= 0

redis.zrangebyscore("zset", "0", "+inf", :limit => [0, 2])
  # => ["a", "b"]

Retrieve members and their scores with scores > 5

redis.zrangebyscore("zset", "(5", "+inf", :with_scores => true)
  # => [["a", 32.0], ["b", 64.0]]

Parameters:

  • key (String)
  • min (String)
    • inclusive minimum score is specified verbatim
    • exclusive minimum score is specified by prefixing (
  • max (String)
    • inclusive maximum score is specified verbatim
    • exclusive maximum score is specified by prefixing (
  • options (Hash) (defaults to: {})
    • :with_scores => true: include scores in output
    • :limit => [offset, count]: skip offset members, return a maximum of count members

Returns:

  • (Array<String>, Array<[String, Float]>)
    • when :with_scores is not specified, an array of members
    • when :with_scores is specified, an array with [member, score] pairs


1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
# File 'lib/redis.rb', line 1514

def zrangebyscore(key, min, max, options = {})
  args = []

  with_scores = options[:with_scores] || options[:withscores]
  args.concat ["WITHSCORES"] if with_scores

  limit = options[:limit]
  args.concat ["LIMIT", *limit] if limit

  synchronize do |client|
    client.call [:zrangebyscore, key, min, max, *args] do |reply|
      if with_scores
        if reply
          reply.each_slice(2).map do |member, score|
            [member, Float(score)]
          end
        end
      else
        reply
      end
    end
  end
end

#zrank(key, member) ⇒ Fixnum

Determine the index of a member in a sorted set.

Parameters:

  • key (String)
  • member (String)

Returns:

  • (Fixnum)


1450
1451
1452
1453
1454
# File 'lib/redis.rb', line 1450

def zrank(key, member)
  synchronize do |client|
    client.call [:zrank, key, member]
  end
end

#zrem(key, member) ⇒ Boolean, Fixnum

Remove one or more members from a sorted set.

Examples:

Remove a single member from a sorted set

redis.zrem("zset", "a")

Remove an array of members from a sorted set

redis.zrem("zset", ["a", "b"])

Parameters:

  • key (String)
  • member (String, Array<String>)
    • a single member
    • an array of members

Returns:

  • (Boolean, Fixnum)
    • Boolean when a single member is specified, holding whether or not it was removed from the sorted set
    • Fixnum when an array of pairs is specified, holding the number of members that were removed to the sorted set


1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
# File 'lib/redis.rb', line 1343

def zrem(key, member)
  synchronize do |client|
    client.call [:zrem, key, member] do |reply|
      if member.is_a? Array
        # Variadic: return integer
        reply
      else
        # Single argument: return boolean
        _boolify.call(reply)
      end
    end
  end
end

#zremrangebyrank(key, start, stop) ⇒ Fixnum

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

Examples:

Remove first 5 members

redis.zremrangebyrank("zset", 0, 4)
  # => 5

Remove last 5 members

redis.zremrangebyrank("zset", -5, -1)
  # => 5

Parameters:

  • key (String)
  • start (Fixnum)

    start index

  • stop (Fixnum)

    stop index

Returns:

  • (Fixnum)

    number of members that were removed



1481
1482
1483
1484
1485
# File 'lib/redis.rb', line 1481

def zremrangebyrank(key, start, stop)
  synchronize do |client|
    client.call [:zremrangebyrank, key, start, stop]
  end
end

#zremrangebyscore(key, min, max) ⇒ Fixnum

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

Examples:

Remove members with score >= 5 and < 100

redis.zremrangebyscore("zset", "5", "(100")
  # => 2

Remove members with scores > 5

redis.zremrangebyscore("zset", "(5", "+inf")
  # => 2

Parameters:

  • key (String)
  • min (String)
    • inclusive minimum score is specified verbatim
    • exclusive minimum score is specified by prefixing (
  • max (String)
    • inclusive maximum score is specified verbatim
    • exclusive maximum score is specified by prefixing (

Returns:

  • (Fixnum)

    number of members that were removed



1593
1594
1595
1596
1597
# File 'lib/redis.rb', line 1593

def zremrangebyscore(key, min, max)
  synchronize do |client|
    client.call [:zremrangebyscore, key, min, max]
  end
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.

Examples:

Retrieve all members from a sorted set

redis.zrevrange("zset", 0, -1)
  # => ["b", "a"]

Retrieve all members and their scores from a sorted set

redis.zrevrange("zset", 0, -1, :with_scores => true)
  # => [["b", 64.0], ["a", 32.0]]

See Also:



1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
# File 'lib/redis.rb', line 1424

def zrevrange(key, start, stop, options = {})
  args = []

  with_scores = options[:with_scores] || options[:withscores]
  args << "WITHSCORES" if with_scores

  synchronize do |client|
    client.call [:zrevrange, key, start, stop, *args] do |reply|
      if with_scores
        if reply
          reply.each_slice(2).map do |member, score|
            [member, Float(score)]
          end
        end
      else
        reply
      end
    end
  end
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.

Examples:

Retrieve members with score < 100 and >= 5

redis.zrevrangebyscore("zset", "(100", "5")
  # => ["b", "a"]

Retrieve the first 2 members with score <= 0

redis.zrevrangebyscore("zset", "0", "-inf", :limit => [0, 2])
  # => ["b", "a"]

Retrieve members and their scores with scores > 5

redis.zrevrangebyscore("zset", "+inf", "(5", :with_scores => true)
  # => [["b", 64.0], ["a", 32.0]]

See Also:



1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
# File 'lib/redis.rb', line 1552

def zrevrangebyscore(key, max, min, options = {})
  args = []

  with_scores = options[:with_scores] || options[:withscores]
  args.concat ["WITHSCORES"] if with_scores

  limit = options[:limit]
  args.concat ["LIMIT", *limit] if limit

  synchronize do |client|
    client.call [:zrevrangebyscore, key, max, min, *args] do |reply|
      if with_scores
        if reply
          reply.each_slice(2).map do |member, score|
            [member, Float(score)]
          end
        end
      else
        reply
      end
    end
  end
end

#zrevrank(key, member) ⇒ Fixnum

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

Parameters:

  • key (String)
  • member (String)

Returns:

  • (Fixnum)


1462
1463
1464
1465
1466
# File 'lib/redis.rb', line 1462

def zrevrank(key, member)
  synchronize do |client|
    client.call [:zrevrank, key, member]
  end
end

#zscore(key, member) ⇒ Float

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

Examples:

Get the score for member "a"

redis.zscore("zset", "a")
  # => 32.0

Parameters:

  • key (String)
  • member (String)

Returns:

  • (Float)

    score of the member



1366
1367
1368
1369
1370
1371
1372
# File 'lib/redis.rb', line 1366

def zscore(key, member)
  synchronize do |client|
    client.call [:zscore, key, member] do |reply|
      Float(reply) if reply
    end
  end
end

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

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

Examples:

Compute the union of 2*zsetA with 1*zsetB, summing their scores

redis.zunionstore("zsetC", ["zsetA", "zsetB"], :weights => [2.0, 1.0], :aggregate => "sum")
  # => 8

Parameters:

  • destination (String)

    destination key

  • keys (Array<String>)

    source keys

  • options (Hash) (defaults to: {})
    • :weights => [Float, Float, ...]: weights to associate with source sorted sets
    • :aggregate => String: aggregate function to use (sum, min, max, ...)

Returns:

  • (Fixnum)

    number of elements in the resulting sorted set



1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
# File 'lib/redis.rb', line 1663

def zunionstore(destination, keys, options = {})
  args = []

  weights = options[:weights]
  args.concat ["WEIGHTS", *weights] if weights

  aggregate = options[:aggregate]
  args.concat ["AGGREGATE", aggregate] if aggregate

  synchronize do |client|
    client.call [:zunionstore, destination, keys.size, *(keys + args)]
  end
end