Class: Redis
- Inherits:
-
Object
- Object
- Redis
- Includes:
- MonitorMixin
- Defined in:
- lib/redis.rb,
lib/redis/client.rb,
lib/redis/errors.rb,
lib/redis/cluster.rb,
lib/redis/version.rb,
lib/redis/pipeline.rb,
lib/redis/hash_ring.rb,
lib/redis/subscribe.rb,
lib/redis/distributed.rb,
lib/redis/cluster/node.rb,
lib/redis/cluster/slot.rb,
lib/redis/cluster/option.rb,
lib/redis/cluster/command.rb,
lib/redis/connection/ruby.rb,
lib/redis/cluster/node_key.rb,
lib/redis/connection/hiredis.rb,
lib/redis/cluster/node_loader.rb,
lib/redis/cluster/slot_loader.rb,
lib/redis/connection/registry.rb,
lib/redis/connection/synchrony.rb,
lib/redis/cluster/command_loader.rb,
lib/redis/connection/command_helper.rb,
lib/redis/cluster/key_slot_converter.rb
Defined Under Namespace
Modules: Connection Classes: BaseConnectionError, BaseError, CannotConnectError, Client, Cluster, CommandError, ConnectionError, Distributed, Future, FutureNotReady, HashRing, InheritedError, InvalidClientOptionError, Pipeline, ProtocolError, SubscribedClient, Subscription, TimeoutError
Constant Summary collapse
- VERSION =
'4.1.4'
Class Method Summary collapse
Instance Method Summary collapse
- #_bpop(cmd, args, &blk) ⇒ Object
- #_client ⇒ Object
- #_eval(cmd, args) ⇒ Object
- #_scan(command, cursor, args, options = {}, &block) ⇒ Object
-
#append(key, value) ⇒ Integer
Append a value to a key.
-
#asking ⇒ String
Sends ‘ASKING` command to random node and returns its reply.
-
#auth(password) ⇒ String
Authenticate to the server.
-
#bgrewriteaof ⇒ String
Asynchronously rewrite the append-only file.
-
#bgsave ⇒ String
Asynchronously save the dataset to disk.
-
#bitcount(key, start = 0, stop = -1)) ⇒ Integer
Count the number of set bits in a range of the string value stored at key.
-
#bitop(operation, destkey, *keys) ⇒ Integer
Perform a bitwise operation between strings and store the resulting string in a key.
-
#bitpos(key, bit, start = nil, stop = nil) ⇒ Integer
Return the position of the first bit set to 1 or 0 in a string.
-
#blpop(*args) ⇒ nil, [String, String]
Remove and get the first element in a list, or block until one is available.
-
#brpop(*args) ⇒ nil, [String, String]
Remove and get the last element in a list, or block until one is available.
-
#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.
-
#bzpopmax(*args) ⇒ Array<String, String, Float>?
Removes and returns up to count members with the highest scores in the sorted set stored at keys, or block until one is available.
-
#bzpopmin(*args) ⇒ Array<String, String, Float>?
Removes and returns up to count members with the lowest scores in the sorted set stored at keys, or block until one is available.
-
#call(*command) ⇒ Object
Sends a command to Redis and returns its reply.
-
#client(subcommand = nil, *args) ⇒ String, Hash
Manage client connections.
-
#close ⇒ Object
(also: #disconnect!)
Disconnect the client as quickly and silently as possible.
-
#cluster(subcommand, *args) ⇒ Object
Sends ‘CLUSTER *` command to random node and returns its reply.
-
#commit ⇒ Object
Sends all commands in the queue.
-
#config(action, *args) ⇒ String, Hash
Get or set server configuration parameters.
-
#connected? ⇒ Boolean
Test whether or not the client is connected.
- #connection ⇒ Object
-
#dbsize ⇒ Integer
Return the number of keys in the selected database.
- #debug(*args) ⇒ Object
-
#decr(key) ⇒ Integer
Decrement the integer value of a key by one.
-
#decrby(key, decrement) ⇒ Integer
Decrement the integer value of a key by the given number.
-
#del(*keys) ⇒ Integer
Delete one or more keys.
-
#discard ⇒ String
Discard all commands issued after MULTI.
-
#dump(key) ⇒ String
Return a serialized version of the value stored at a key.
- #dup ⇒ Object
-
#echo(value) ⇒ String
Echo the given string.
-
#eval(*args) ⇒ Object
Evaluate Lua script.
-
#evalsha(*args) ⇒ Object
Evaluate Lua script by its SHA.
-
#exec ⇒ nil, Array<...>
Execute all commands issued after MULTI.
-
#exists(key) ⇒ Boolean
Determine if a key exists.
-
#expire(key, seconds) ⇒ Boolean
Set a key’s time to live in seconds.
-
#expireat(key, unix_time) ⇒ Boolean
Set the expiration for a key as a UNIX timestamp.
-
#flushall(options = nil) ⇒ String
Remove all keys from all databases.
-
#flushdb(options = nil) ⇒ String
Remove all keys from the current database.
-
#geoadd(key, *member) ⇒ Integer
Adds the specified geospatial items (latitude, longitude, name) to the specified key.
-
#geodist(key, member1, member2, unit = 'm') ⇒ String?
Returns the distance between two members of a geospatial index.
-
#geohash(key, member) ⇒ Array<String, nil>
Returns geohash string representing position for specified members of the specified key.
-
#geopos(key, member) ⇒ Array<Array<String>, nil>
Returns longitude and latitude of members of a geospatial index.
-
#georadius(*args, **geoptions) ⇒ Array<String>
Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point.
-
#georadiusbymember(*args, **geoptions) ⇒ Array<String>
Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from an already existing member.
-
#get(key) ⇒ String
Get the value of a key.
-
#getbit(key, offset) ⇒ Integer
Returns the bit value at offset in the string value stored at key.
-
#getrange(key, start, stop) ⇒ Integer
Get a substring of the string stored at a key.
-
#getset(key, value) ⇒ String
Set the string value of a key and return its old value.
-
#hdel(key, *fields) ⇒ Integer
Delete one or more hash fields.
-
#hexists(key, field) ⇒ Boolean
Determine if a hash field exists.
-
#hget(key, field) ⇒ String
Get the value of a hash field.
-
#hgetall(key) ⇒ Hash<String, String>
Get all the fields and values in a hash.
-
#hincrby(key, field, increment) ⇒ Integer
Increment the integer value of a hash field by the given integer number.
-
#hincrbyfloat(key, field, increment) ⇒ Float
Increment the numeric value of a hash field by the given float number.
-
#hkeys(key) ⇒ Array<String>
Get all the fields in a hash.
-
#hlen(key) ⇒ Integer
Get the number of fields in a hash.
-
#hmget(key, *fields, &blk) ⇒ Array<String>
Get the values of all the given hash fields.
-
#hmset(key, *attrs) ⇒ String
Set one or more hash values.
-
#hscan(key, cursor, options = {}) ⇒ String, Array<[String, String]>
Scan a hash.
-
#hscan_each(key, options = {}, &block) ⇒ Enumerator
Scan a hash.
-
#hset(key, field, value) ⇒ Boolean
Set the string value of a hash field.
-
#hsetnx(key, field, value) ⇒ Boolean
Set the value of a hash field, only if the field does not exist.
-
#hvals(key) ⇒ Array<String>
Get all the values in a hash.
- #id ⇒ Object
-
#incr(key) ⇒ Integer
Increment the integer value of a key by one.
-
#incrby(key, increment) ⇒ Integer
Increment the integer value of a key by the given integer number.
-
#incrbyfloat(key, increment) ⇒ Float
Increment the numeric value of a key by the given float number.
-
#info(cmd = nil) ⇒ Hash<String, String>
Get information and statistics about the server.
-
#initialize(options = {}) ⇒ Redis
constructor
Create a new client instance.
- #inspect ⇒ Object
-
#keys(pattern = "*") ⇒ Array<String>
Find all keys matching the given pattern.
-
#lastsave ⇒ Integer
Get the UNIX time stamp of the last successful save to disk.
-
#lindex(key, index) ⇒ String
Get an element from a list by its index.
-
#linsert(key, where, pivot, value) ⇒ Integer
Insert an element before or after another element in a list.
-
#llen(key) ⇒ Integer
Get the length of a list.
-
#lpop(key) ⇒ String
Remove and get the first element in a list.
-
#lpush(key, value) ⇒ Integer
Prepend one or more values to a list, creating the list if it doesn’t exist.
-
#lpushx(key, value) ⇒ Integer
Prepend a value to a list, only if the list exists.
-
#lrange(key, start, stop) ⇒ Array<String>
Get a range of elements from a list.
-
#lrem(key, count, value) ⇒ Integer
Remove elements from a list.
-
#lset(key, index, value) ⇒ String
Set the value of an element in a list by its index.
-
#ltrim(key, start, stop) ⇒ String
Trim a list to the specified range.
-
#mapped_hmget(key, *fields) ⇒ Hash
Get the values of all the given hash fields.
-
#mapped_hmset(key, hash) ⇒ String
Set one or more hash values.
-
#mapped_mget(*keys) ⇒ Hash
Get the values of all the given keys.
-
#mapped_mset(hash) ⇒ String
Set one or more values.
-
#mapped_msetnx(hash) ⇒ Boolean
Set one or more values, only if none of the keys exist.
- #method_missing(command, *args) ⇒ Object
-
#mget(*keys, &blk) ⇒ Array<String>
Get the values of all the given keys.
-
#migrate(key, options) ⇒ String
Transfer a key from the connected instance to another instance.
-
#monitor {|line| ... } ⇒ Object
Listen for all requests received by the server in real time.
-
#move(key, db) ⇒ Boolean
Move a key to another database.
-
#mset(*args) ⇒ String
Set one or more values.
-
#msetnx(*args) ⇒ Boolean
Set one or more values, only if none of the keys exist.
-
#multi {|multi| ... } ⇒ String, Array<...>
Mark the start of a transaction block.
- #object(*args) ⇒ Object
-
#persist(key) ⇒ Boolean
Remove the expiration from a key.
-
#pexpire(key, milliseconds) ⇒ Boolean
Set a key’s time to live in milliseconds.
-
#pexpireat(key, ms_unix_time) ⇒ Boolean
Set the expiration for a key as number of milliseconds from UNIX Epoch.
-
#pfadd(key, member) ⇒ Boolean
Add one or more members to a HyperLogLog structure.
-
#pfcount(*keys) ⇒ Integer
Get the approximate cardinality of members added to HyperLogLog structure.
-
#pfmerge(dest_key, *source_key) ⇒ Boolean
Merge multiple HyperLogLog values into an unique value that will approximate the cardinality of the union of the observed Sets of the source HyperLogLog structures.
-
#ping(message = nil) ⇒ String
Ping the server.
- #pipelined ⇒ Object
-
#psetex(key, ttl, value) ⇒ String
Set the time to live in milliseconds of a key.
-
#psubscribe(*channels, &block) ⇒ Object
Listen for messages published to channels matching the given patterns.
-
#psubscribe_with_timeout(timeout, *channels, &block) ⇒ Object
Listen for messages published to channels matching the given patterns.
-
#pttl(key) ⇒ Integer
Get the time to live (in milliseconds) for a key.
-
#publish(channel, message) ⇒ Object
Post a message to a channel.
-
#pubsub(subcommand, *args) ⇒ Object
Inspect the state of the Pub/Sub subsystem.
-
#punsubscribe(*channels) ⇒ Object
Stop listening for messages posted to channels matching the given patterns.
-
#queue(*command) ⇒ Object
Queues a command for pipelining.
-
#quit ⇒ String
Close the connection.
-
#randomkey ⇒ String
Return a random key from the keyspace.
-
#rename(old_name, new_name) ⇒ String
Rename a key.
-
#renamenx(old_name, new_name) ⇒ Boolean
Rename a key, only if the new key does not exist.
-
#restore(key, ttl, serialized_value, options = {}) ⇒ String
Create a key using the serialized value, previously obtained using DUMP.
-
#rpop(key) ⇒ String
Remove and get the last element in a list.
-
#rpoplpush(source, destination) ⇒ nil, String
Remove the last element in a list, append it to another list and return it.
-
#rpush(key, value) ⇒ Integer
Append one or more values to a list, creating the list if it doesn’t exist.
-
#rpushx(key, value) ⇒ Integer
Append a value to a list, only if the list exists.
-
#sadd(key, member) ⇒ Boolean, Integer
Add one or more members to a set.
-
#save ⇒ String
Synchronously save the dataset to disk.
-
#scan(cursor, options = {}) ⇒ String+
Scan the keyspace.
-
#scan_each(options = {}, &block) ⇒ Enumerator
Scan the keyspace.
-
#scard(key) ⇒ Integer
Get the number of members in a set.
-
#script(subcommand, *args) ⇒ String, ...
Control remote script registry.
-
#sdiff(*keys) ⇒ Array<String>
Subtract multiple sets.
-
#sdiffstore(destination, *keys) ⇒ Integer
Subtract multiple sets and store the resulting set in a key.
-
#select(db) ⇒ String
Change the selected database for the current connection.
-
#sentinel(subcommand, *args) ⇒ Array<String>, ...
Interact with the sentinel command (masters, master, slaves, failover).
-
#set(key, value, options = {}) ⇒ String, Boolean
Set the string value of a key.
-
#setbit(key, offset, value) ⇒ Integer
Sets or clears the bit at offset in the string value stored at key.
-
#setex(key, ttl, value) ⇒ String
Set the time to live in seconds of a key.
-
#setnx(key, value) ⇒ Boolean
Set the value of a key, only if the key does not exist.
-
#setrange(key, offset, value) ⇒ Integer
Overwrite part of a string at key starting at the specified offset.
-
#shutdown ⇒ Object
Synchronously save the dataset to disk and then shut down the server.
-
#sinter(*keys) ⇒ Array<String>
Intersect multiple sets.
-
#sinterstore(destination, *keys) ⇒ Integer
Intersect multiple sets and store the resulting set in a key.
-
#sismember(key, member) ⇒ Boolean
Determine if a given value is a member of a set.
-
#slaveof(host, port) ⇒ Object
Make the server a slave of another instance, or promote it as master.
-
#slowlog(subcommand, length = nil) ⇒ Array<String>, ...
Interact with the slowlog (get, len, reset).
-
#smembers(key) ⇒ Array<String>
Get all the members in a set.
-
#smove(source, destination, member) ⇒ Boolean
Move a member from one set to another.
-
#sort(key, options = {}) ⇒ Array<String>, ...
Sort the elements in a list, set or sorted set.
-
#spop(key, count = nil) ⇒ String
Remove and return one or more random member from a set.
-
#srandmember(key, count = nil) ⇒ String
Get one or more random members from a set.
-
#srem(key, member) ⇒ Boolean, Integer
Remove one or more members from a set.
-
#sscan(key, cursor, options = {}) ⇒ String+
Scan a set.
-
#sscan_each(key, options = {}, &block) ⇒ Enumerator
Scan a set.
-
#strlen(key) ⇒ Integer
Get the length of the value stored in a key.
-
#subscribe(*channels, &block) ⇒ Object
Listen for messages published to the given channels.
-
#subscribe_with_timeout(timeout, *channels, &block) ⇒ Object
Listen for messages published to the given channels.
- #subscribed? ⇒ Boolean
-
#sunion(*keys) ⇒ Array<String>
Add multiple sets.
-
#sunionstore(destination, *keys) ⇒ Integer
Add multiple sets and store the resulting set in a key.
-
#sync ⇒ Object
Internal command used for replication.
- #synchronize ⇒ Object
-
#time ⇒ Array<Integer>
Return the server time.
-
#ttl(key) ⇒ Integer
Get the time to live (in seconds) for a key.
-
#type(key) ⇒ String
Determine the type stored at key.
-
#unlink(*keys) ⇒ Integer
Unlink one or more keys.
-
#unsubscribe(*channels) ⇒ Object
Stop listening for messages posted to the given channels.
-
#unwatch ⇒ String
Forget about all watched keys.
-
#watch(*keys) ⇒ Object, String
Watch the given keys to determine execution of the MULTI/EXEC block.
-
#with_reconnect(val = true, &blk) ⇒ Object
Run code with the client reconnecting.
-
#without_reconnect(&blk) ⇒ Object
Run code without the client reconnecting.
-
#xack(key, group, *ids) ⇒ Integer
Removes one or multiple entries from the pending entries list of a stream consumer group.
-
#xadd(key, entry, opts = {}) ⇒ String
Add new entry to the stream.
-
#xclaim(key, group, consumer, min_idle_time, *ids, **opts) ⇒ Hash{String => Hash}, Array<String>
Changes the ownership of a pending entry.
-
#xdel(key, *ids) ⇒ Integer
Delete entries by entry ids.
-
#xgroup(subcommand, key, group, id_or_consumer = nil, mkstream: false) ⇒ String, Integer
Manages the consumer group of the stream.
-
#xinfo(subcommand, key, group = nil) ⇒ Hash+
Returns the stream information each subcommand.
-
#xlen(key) ⇒ Integer
Returns the number of entries inside a stream.
-
#xpending(key, group, *args) ⇒ Hash+
Fetches not acknowledging pending entries.
-
#xrange(key, start = '-', _end = '+', count: nil) ⇒ Array<Array<String, Hash>>
Fetches entries of the stream in ascending order.
-
#xread(keys, ids, count: nil, block: nil) ⇒ Hash{String => Hash{String => Hash}}
Fetches entries from one or multiple streams.
-
#xreadgroup(group, consumer, keys, ids, opts = {}) ⇒ Hash{String => Hash{String => Hash}}
Fetches a subset of the entries from one or multiple streams related with the consumer group.
-
#xrevrange(key, _end = '+', start = '-', count: nil) ⇒ Array<Array<String, Hash>>
Fetches entries of the stream in descending order.
-
#xtrim(key, maxlen, approximate: false) ⇒ Integer
Trims older entries of the stream if needed.
-
#zadd(key, *args) ⇒ Boolean, ...
Add one or more members to a sorted set, or update the score for members that already exist.
-
#zcard(key) ⇒ Integer
Get the number of members in a sorted set.
-
#zcount(key, min, max) ⇒ Integer
Count the members in a sorted set with scores within the given values.
-
#zincrby(key, increment, member) ⇒ Float
Increment the score of a member in a sorted set.
-
#zinterstore(destination, keys, options = {}) ⇒ Integer
Intersect multiple sorted sets and store the resulting sorted set in a new key.
-
#zlexcount(key, min, max) ⇒ Integer
Count the members, with the same score in a sorted set, within the given lexicographical range.
-
#zpopmax(key, count = nil) ⇒ Array<String, Float>+
Removes and returns up to count members with the highest scores in the sorted set stored at key.
-
#zpopmin(key, count = nil) ⇒ Array<String, Float>+
Removes and returns up to count members with the lowest scores in the sorted set stored at key.
-
#zrange(key, start, stop, options = {}) ⇒ Array<String>, Array<[String, Float]>
Return a range of members in a sorted set, by index.
-
#zrangebylex(key, min, max, options = {}) ⇒ Array<String>, Array<[String, Float]>
Return a range of members with the same score in a sorted set, by lexicographical ordering.
-
#zrangebyscore(key, min, max, options = {}) ⇒ Array<String>, Array<[String, Float]>
Return a range of members in a sorted set, by score.
-
#zrank(key, member) ⇒ Integer
Determine the index of a member in a sorted set.
-
#zrem(key, member) ⇒ Boolean, Integer
Remove one or more members from a sorted set.
-
#zremrangebyrank(key, start, stop) ⇒ Integer
Remove all members in a sorted set within the given indexes.
-
#zremrangebyscore(key, min, max) ⇒ Integer
Remove all members in a sorted set within the given scores.
-
#zrevrange(key, start, stop, options = {}) ⇒ Object
Return a range of members in a sorted set, by index, with scores ordered from high to low.
-
#zrevrangebylex(key, max, min, options = {}) ⇒ Object
Return a range of members with the same score in a sorted set, by reversed lexicographical ordering.
-
#zrevrangebyscore(key, max, min, options = {}) ⇒ Object
Return a range of members in a sorted set, by score, with scores ordered from high to low.
-
#zrevrank(key, member) ⇒ Integer
Determine the index of a member in a sorted set, with scores ordered from high to low.
-
#zscan(key, cursor, options = {}) ⇒ String, Array<[String, Float]>
Scan a sorted set.
-
#zscan_each(key, options = {}, &block) ⇒ Enumerator
Scan a sorted set.
-
#zscore(key, member) ⇒ Float
Get the score associated with the given member in a sorted set.
-
#zunionstore(destination, keys, options = {}) ⇒ Integer
Add multiple sorted sets and store the resulting sorted set in a new key.
Constructor Details
#initialize(options = {}) ⇒ Redis
Create a new client instance
40 41 42 43 44 45 46 47 48 |
# File 'lib/redis.rb', line 40 def initialize( = {}) @options = .dup @cluster_mode = .key?(:cluster) client = @cluster_mode ? Cluster : Client @original_client = @client = client.new() @queue = Hash.new { |h, k| h[k] = [] } super() # Monitor#initialize end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(command, *args) ⇒ Object
3310 3311 3312 3313 3314 |
# File 'lib/redis.rb', line 3310 def method_missing(command, *args) synchronize do |client| client.call([command] + args) end end |
Class Method Details
.current=(redis) ⇒ Object
11 12 13 |
# File 'lib/redis.rb', line 11 def self.current=(redis) @current = redis end |
Instance Method Details
#_bpop(cmd, args, &blk) ⇒ Object
1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 |
# File 'lib/redis.rb', line 1167 def _bpop(cmd, args, &blk) timeout = if args.last.is_a?(Hash) = args.pop [:timeout] elsif args.last.respond_to?(:to_int) # Issue deprecation notice in obnoxious mode... args.pop.to_int end timeout ||= 0 if args.size > 1 # Issue deprecation notice in obnoxious mode... end keys = args.flatten synchronize do |client| command = [cmd, keys, timeout] timeout += client.timeout if timeout > 0 client.call_with_timeout(command, timeout, &blk) end end |
#_client ⇒ Object
122 123 124 |
# File 'lib/redis.rb', line 122 def _client @client end |
#_eval(cmd, args) ⇒ Object
2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 |
# File 'lib/redis.rb', line 2549 def _eval(cmd, args) script = args.shift = args.pop if args.last.is_a?(Hash) ||= {} keys = args.shift || [:keys] || [] argv = args.shift || [:argv] || [] synchronize do |client| client.call([cmd, script, keys.length] + keys + argv) end end |
#_scan(command, cursor, args, options = {}, &block) ⇒ Object
2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 |
# File 'lib/redis.rb', line 2612 def _scan(command, cursor, args, = {}, &block) # SSCAN/ZSCAN/HSCAN already prepend the key to +args+. args << cursor if match = [:match] args.concat(["MATCH", match]) end if count = [:count] args.concat(["COUNT", count]) end synchronize do |client| client.call([command] + args, &block) end end |
#append(key, value) ⇒ Integer
Append a value to a key.
1008 1009 1010 1011 1012 |
# File 'lib/redis.rb', line 1008 def append(key, value) synchronize do |client| client.call([:append, key, value]) end end |
#asking ⇒ String
Sends ‘ASKING` command to random node and returns its reply.
3282 3283 3284 |
# File 'lib/redis.rb', line 3282 def asking synchronize { |client| client.call(%i[asking]) } end |
#auth(password) ⇒ String
Authenticate to the server.
131 132 133 134 135 |
# File 'lib/redis.rb', line 131 def auth(password) synchronize do |client| client.call([:auth, password]) end end |
#bgrewriteaof ⇒ String
Asynchronously rewrite the append-only file.
185 186 187 188 189 |
# File 'lib/redis.rb', line 185 def bgrewriteaof synchronize do |client| client.call([:bgrewriteaof]) end end |
#bgsave ⇒ String
Asynchronously save the dataset to disk.
194 195 196 197 198 |
# File 'lib/redis.rb', line 194 def bgsave synchronize do |client| client.call([:bgsave]) end end |
#bitcount(key, start = 0, stop = -1)) ⇒ Integer
Count the number of set bits in a range of the string value stored at key.
1020 1021 1022 1023 1024 |
# File 'lib/redis.rb', line 1020 def bitcount(key, start = 0, stop = -1) synchronize do |client| client.call([:bitcount, key, start, stop]) end end |
#bitop(operation, destkey, *keys) ⇒ Integer
Perform a bitwise operation between strings and store the resulting string in a key.
1032 1033 1034 1035 1036 |
# File 'lib/redis.rb', line 1032 def bitop(operation, destkey, *keys) synchronize do |client| client.call([:bitop, operation, destkey] + keys) end end |
#bitpos(key, bit, start = nil, stop = nil) ⇒ Integer
Return the position of the first bit set to 1 or 0 in a string.
1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 |
# File 'lib/redis.rb', line 1046 def bitpos(key, bit, start=nil, stop=nil) if stop and not start raise(ArgumentError, 'stop parameter specified without start parameter') end synchronize do |client| command = [:bitpos, key, bit] command << start if start command << stop if stop client.call(command) end end |
#blpop(*args) ⇒ nil, [String, String]
Remove and get the first element in a list, or block until one is available.
1212 1213 1214 |
# File 'lib/redis.rb', line 1212 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.
1228 1229 1230 |
# File 'lib/redis.rb', line 1228 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.
1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 |
# File 'lib/redis.rb', line 1243 def brpoplpush(source, destination, = {}) case when Integer # Issue deprecation notice in obnoxious mode... = { :timeout => } end timeout = [:timeout] || 0 synchronize do |client| command = [:brpoplpush, source, destination, timeout] timeout += client.timeout if timeout > 0 client.call_with_timeout(command, timeout) end end |
#bzpopmax(*args) ⇒ Array<String, String, Float>?
Removes and returns up to count members with the highest scores in the sorted set stored at keys,
or block until one is available.
1695 1696 1697 1698 1699 |
# File 'lib/redis.rb', line 1695 def bzpopmax(*args) _bpop(:bzpopmax, args) do |reply| reply.is_a?(Array) ? [reply[0], reply[1], Floatify.call(reply[2])] : reply end end |
#bzpopmin(*args) ⇒ Array<String, String, Float>?
Removes and returns up to count members with the lowest scores in the sorted set stored at keys,
or block until one is available.
1716 1717 1718 1719 1720 |
# File 'lib/redis.rb', line 1716 def bzpopmin(*args) _bpop(:bzpopmin, args) do |reply| reply.is_a?(Array) ? [reply[0], reply[1], Floatify.call(reply[2])] : reply end end |
#call(*command) ⇒ Object
Sends a command to Redis and returns its reply.
Replies are converted to Ruby objects according to the RESP protocol, so you can expect a Ruby array, integer or nil when Redis sends one. Higher level transformations, such as converting an array of pairs into a Ruby hash, are up to consumers.
Redis error replies are raised as Ruby exceptions.
85 86 87 88 89 |
# File 'lib/redis.rb', line 85 def call(*command) synchronize do |client| client.call(command) end end |
#client(subcommand = nil, *args) ⇒ String, Hash
Manage client connections.
221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
# File 'lib/redis.rb', line 221 def client(subcommand = nil, *args) synchronize do |client| client.call([:client, subcommand] + args) do |reply| if subcommand.to_s == "list" reply.lines.map do |line| entries = line.chomp.split(/[ =]/) Hash[entries.each_slice(2).to_a] end else reply end end end end |
#close ⇒ Object Also known as: disconnect!
Disconnect the client as quickly and silently as possible.
72 73 74 |
# File 'lib/redis.rb', line 72 def close @original_client.disconnect end |
#cluster(subcommand, *args) ⇒ Object
Sends ‘CLUSTER *` command to random node and returns its reply.
3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 |
# File 'lib/redis.rb', line 3259 def cluster(subcommand, *args) subcommand = subcommand.to_s.downcase block = case subcommand when 'slots' then HashifyClusterSlots when 'nodes' then HashifyClusterNodes when 'slaves' then HashifyClusterSlaves when 'info' then HashifyInfo else Noop end # @see https://github.com/antirez/redis/blob/unstable/src/redis-trib.rb#L127 raw reply expected block = Noop unless @cluster_mode synchronize do |client| client.call([:cluster, subcommand] + args, &block) end end |
#commit ⇒ Object
Sends all commands in the queue.
See redis.io/topics/pipelining for more details.
107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/redis.rb', line 107 def commit synchronize do |client| begin pipeline = Pipeline.new(client) @queue[Thread.current.object_id].each do |command| pipeline.call(command) end client.call_pipelined(pipeline) ensure @queue.delete(Thread.current.object_id) end end end |
#config(action, *args) ⇒ String, Hash
Get or set server configuration parameters.
205 206 207 208 209 210 211 212 213 214 215 |
# File 'lib/redis.rb', line 205 def config(action, *args) synchronize do |client| client.call([:config, action] + args) do |reply| if reply.kind_of?(Array) && action == :get Hashify.call(reply) else reply end end end end |
#connected? ⇒ Boolean
Test whether or not the client is connected
67 68 69 |
# File 'lib/redis.rb', line 67 def connected? @original_client.connected? end |
#connection ⇒ Object
3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 |
# File 'lib/redis.rb', line 3298 def connection return @original_client.connection_info if @cluster_mode { host: @original_client.host, port: @original_client.port, db: @original_client.db, id: @original_client.id, location: @original_client.location } end |
#dbsize ⇒ Integer
Return the number of keys in the selected database.
239 240 241 242 243 |
# File 'lib/redis.rb', line 239 def dbsize synchronize do |client| client.call([:dbsize]) end end |
#debug(*args) ⇒ Object
245 246 247 248 249 |
# File 'lib/redis.rb', line 245 def debug(*args) synchronize do |client| client.call([:debug] + args) end end |
#decr(key) ⇒ Integer
Decrement the integer value of a key by one.
715 716 717 718 719 |
# File 'lib/redis.rb', line 715 def decr(key) synchronize do |client| client.call([:decr, key]) end end |
#decrby(key, decrement) ⇒ Integer
Decrement the integer value of a key by the given number.
730 731 732 733 734 |
# File 'lib/redis.rb', line 730 def decrby(key, decrement) synchronize do |client| client.call([:decrby, key, decrement]) end end |
#del(*keys) ⇒ Integer
Delete one or more keys.
537 538 539 540 541 |
# File 'lib/redis.rb', line 537 def del(*keys) synchronize do |client| client.call([:del] + keys) end end |
#discard ⇒ String
Discard all commands issued after MULTI.
Only call this method when ‘#multi` was called without a block.
2495 2496 2497 2498 2499 |
# File 'lib/redis.rb', line 2495 def discard synchronize do |client| client.call([:discard]) end end |
#dump(key) ⇒ String
Return a serialized version of the value stored at a key.
484 485 486 487 488 |
# File 'lib/redis.rb', line 484 def dump(key) synchronize do |client| client.call([:dump, key]) end end |
#dup ⇒ Object
3294 3295 3296 |
# File 'lib/redis.rb', line 3294 def dup self.class.new(@options) end |
#echo(value) ⇒ String
Echo the given string.
162 163 164 165 166 |
# File 'lib/redis.rb', line 162 def echo(value) synchronize do |client| client.call([:echo, value]) end end |
#eval(*args) ⇒ Object
Evaluate Lua script.
2583 2584 2585 |
# File 'lib/redis.rb', line 2583 def eval(*args) _eval(:eval, args) end |
#evalsha(*args) ⇒ Object
Evaluate Lua script by its SHA.
2608 2609 2610 |
# File 'lib/redis.rb', line 2608 def evalsha(*args) _eval(:evalsha, args) end |
#exec ⇒ nil, Array<...>
Execute all commands issued after MULTI.
Only call this method when ‘#multi` was called without a block.
2481 2482 2483 2484 2485 |
# File 'lib/redis.rb', line 2481 def exec synchronize do |client| client.call([:exec]) end end |
#exists(key) ⇒ Boolean
Determine if a key exists.
557 558 559 560 561 |
# File 'lib/redis.rb', line 557 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.
406 407 408 409 410 |
# File 'lib/redis.rb', line 406 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.
417 418 419 420 421 |
# File 'lib/redis.rb', line 417 def expireat(key, unix_time) synchronize do |client| client.call([:expireat, key, unix_time], &Boolify) end end |
#flushall(options = nil) ⇒ String
Remove all keys from all databases.
256 257 258 259 260 261 262 263 264 |
# File 'lib/redis.rb', line 256 def flushall( = nil) synchronize do |client| if && [:async] client.call([:flushall, :async]) else client.call([:flushall]) end end end |
#flushdb(options = nil) ⇒ String
Remove all keys from the current database.
271 272 273 274 275 276 277 278 279 |
# File 'lib/redis.rb', line 271 def flushdb( = nil) synchronize do |client| if && [:async] client.call([:flushdb, :async]) else client.call([:flushdb]) end end end |
#geoadd(key, *member) ⇒ Integer
Adds the specified geospatial items (latitude, longitude, name) to the specified key
2828 2829 2830 2831 2832 |
# File 'lib/redis.rb', line 2828 def geoadd(key, *member) synchronize do |client| client.call([:geoadd, key, *member]) end end |
#geodist(key, member1, member2, unit = 'm') ⇒ String?
Returns the distance between two members of a geospatial index
2897 2898 2899 2900 2901 |
# File 'lib/redis.rb', line 2897 def geodist(key, member1, member2, unit = 'm') synchronize do |client| client.call([:geodist, key, member1, member2, unit]) end end |
#geohash(key, member) ⇒ Array<String, nil>
Returns geohash string representing position for specified members of the specified key.
2839 2840 2841 2842 2843 |
# File 'lib/redis.rb', line 2839 def geohash(key, member) synchronize do |client| client.call([:geohash, key, member]) end end |
#geopos(key, member) ⇒ Array<Array<String>, nil>
Returns longitude and latitude of members of a geospatial index
2885 2886 2887 2888 2889 |
# File 'lib/redis.rb', line 2885 def geopos(key, member) synchronize do |client| client.call([:geopos, key, member]) end end |
#georadius(*args, **geoptions) ⇒ Array<String>
Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point
2855 2856 2857 2858 2859 2860 2861 |
# File 'lib/redis.rb', line 2855 def georadius(*args, **) geoarguments = _geoarguments(*args, **) synchronize do |client| client.call([:georadius, *geoarguments]) end end |
#georadiusbymember(*args, **geoptions) ⇒ Array<String>
Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from an already existing member
2872 2873 2874 2875 2876 2877 2878 |
# File 'lib/redis.rb', line 2872 def georadiusbymember(*args, **) geoarguments = _geoarguments(*args, **) synchronize do |client| client.call([:georadiusbymember, *geoarguments]) end end |
#get(key) ⇒ String
Get the value of a key.
913 914 915 916 917 |
# File 'lib/redis.rb', line 913 def get(key) synchronize do |client| client.call([:get, key]) end end |
#getbit(key, offset) ⇒ Integer
Returns the bit value at offset in the string value stored at key.
997 998 999 1000 1001 |
# File 'lib/redis.rb', line 997 def getbit(key, offset) synchronize do |client| client.call([:getbit, key, offset]) end end |
#getrange(key, start, stop) ⇒ Integer
Get a substring of the string stored at a key.
974 975 976 977 978 |
# File 'lib/redis.rb', line 974 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.
1065 1066 1067 1068 1069 |
# File 'lib/redis.rb', line 1065 def getset(key, value) synchronize do |client| client.call([:getset, key, value.to_s]) end end |
#hdel(key, *fields) ⇒ Integer
Delete one or more hash fields.
2214 2215 2216 2217 2218 |
# File 'lib/redis.rb', line 2214 def hdel(key, *fields) synchronize do |client| client.call([:hdel, key, *fields]) end end |
#hexists(key, field) ⇒ Boolean
Determine if a hash field exists.
2225 2226 2227 2228 2229 |
# File 'lib/redis.rb', line 2225 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.
2165 2166 2167 2168 2169 |
# File 'lib/redis.rb', line 2165 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.
2279 2280 2281 2282 2283 |
# File 'lib/redis.rb', line 2279 def hgetall(key) synchronize do |client| client.call([:hgetall, key], &Hashify) end end |
#hincrby(key, field, increment) ⇒ Integer
Increment the integer value of a hash field by the given integer number.
2237 2238 2239 2240 2241 |
# File 'lib/redis.rb', line 2237 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.
2249 2250 2251 2252 2253 |
# File 'lib/redis.rb', line 2249 def hincrbyfloat(key, field, increment) synchronize do |client| client.call([:hincrbyfloat, key, field, increment], &Floatify) end end |
#hkeys(key) ⇒ Array<String>
Get all the fields in a hash.
2259 2260 2261 2262 2263 |
# File 'lib/redis.rb', line 2259 def hkeys(key) synchronize do |client| client.call([:hkeys, key]) end end |
#hlen(key) ⇒ Integer
Get the number of fields in a hash.
2098 2099 2100 2101 2102 |
# File 'lib/redis.rb', line 2098 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.
2182 2183 2184 2185 2186 |
# File 'lib/redis.rb', line 2182 def hmget(key, *fields, &blk) synchronize do |client| client.call([:hmget, key] + fields, &blk) end end |
#hmset(key, *attrs) ⇒ String
Set one or more hash values.
2139 2140 2141 2142 2143 |
# File 'lib/redis.rb', line 2139 def hmset(key, *attrs) synchronize do |client| client.call([:hmset, key] + attrs) end end |
#hscan(key, cursor, options = {}) ⇒ String, Array<[String, String]>
Scan a hash
2685 2686 2687 2688 2689 |
# File 'lib/redis.rb', line 2685 def hscan(key, cursor, ={}) _scan(:hscan, cursor, [key], ) do |reply| [reply[0], reply[1].each_slice(2).to_a] end end |
#hscan_each(key, options = {}, &block) ⇒ Enumerator
Scan a hash
2702 2703 2704 2705 2706 2707 2708 2709 2710 |
# File 'lib/redis.rb', line 2702 def hscan_each(key, ={}, &block) return to_enum(:hscan_each, key, ) unless block_given? cursor = 0 loop do cursor, values = hscan(key, cursor, ) values.each(&block) break if cursor == "0" end end |
#hset(key, field, value) ⇒ Boolean
Set the string value of a hash field.
2110 2111 2112 2113 2114 |
# File 'lib/redis.rb', line 2110 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.
2122 2123 2124 2125 2126 |
# File 'lib/redis.rb', line 2122 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.
2269 2270 2271 2272 2273 |
# File 'lib/redis.rb', line 2269 def hvals(key) synchronize do |client| client.call([:hvals, key]) end end |
#id ⇒ Object
3286 3287 3288 |
# File 'lib/redis.rb', line 3286 def id @original_client.id end |
#incr(key) ⇒ Integer
Increment the integer value of a key by one.
744 745 746 747 748 |
# File 'lib/redis.rb', line 744 def incr(key) synchronize do |client| client.call([:incr, key]) end end |
#incrby(key, increment) ⇒ Integer
Increment the integer value of a key by the given integer number.
759 760 761 762 763 |
# File 'lib/redis.rb', line 759 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.
774 775 776 777 778 |
# File 'lib/redis.rb', line 774 def incrbyfloat(key, increment) synchronize do |client| client.call([:incrbyfloat, key, increment], &Floatify) end end |
#info(cmd = nil) ⇒ Hash<String, String>
Get information and statistics about the server.
285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 |
# File 'lib/redis.rb', line 285 def info(cmd = nil) synchronize do |client| client.call([:info, cmd].compact) do |reply| if reply.kind_of?(String) reply = HashifyInfo.call(reply) if cmd && cmd.to_s == "commandstats" # Extract nested hashes for INFO COMMANDSTATS reply = Hash[reply.map do |k, v| v = v.split(",").map { |e| e.split("=") } [k[/^cmdstat_(.*)$/, 1], Hash[v]] end] end end reply end end end |
#inspect ⇒ Object
3290 3291 3292 |
# File 'lib/redis.rb', line 3290 def inspect "#<Redis client v#{Redis::VERSION} for #{id}>" end |
#keys(pattern = "*") ⇒ Array<String>
Find all keys matching the given pattern.
567 568 569 570 571 572 573 574 575 576 577 |
# File 'lib/redis.rb', line 567 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 |
#lastsave ⇒ Integer
Get the UNIX time stamp of the last successful save to disk.
308 309 310 311 312 |
# File 'lib/redis.rb', line 308 def lastsave synchronize do |client| client.call([:lastsave]) end end |
#lindex(key, index) ⇒ String
Get an element from a list by its index.
1264 1265 1266 1267 1268 |
# File 'lib/redis.rb', line 1264 def lindex(key, index) synchronize do |client| client.call([:lindex, key, index]) end end |
#linsert(key, where, pivot, value) ⇒ Integer
Insert an element before or after another element in a list.
1278 1279 1280 1281 1282 |
# File 'lib/redis.rb', line 1278 def linsert(key, where, pivot, value) synchronize do |client| client.call([:linsert, key, where, pivot, value]) end end |
#llen(key) ⇒ Integer
Get the length of a list.
1086 1087 1088 1089 1090 |
# File 'lib/redis.rb', line 1086 def llen(key) synchronize do |client| client.call([:llen, key]) end end |
#lpop(key) ⇒ String
Remove and get the first element in a list.
1140 1141 1142 1143 1144 |
# File 'lib/redis.rb', line 1140 def lpop(key) synchronize do |client| client.call([:lpop, key]) end end |
#lpush(key, value) ⇒ Integer
Prepend one or more values to a list, creating the list if it doesn’t exist
1097 1098 1099 1100 1101 |
# File 'lib/redis.rb', line 1097 def lpush(key, value) synchronize do |client| client.call([:lpush, key, value]) end end |
#lpushx(key, value) ⇒ Integer
Prepend a value to a list, only if the list exists.
1108 1109 1110 1111 1112 |
# File 'lib/redis.rb', line 1108 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.
1290 1291 1292 1293 1294 |
# File 'lib/redis.rb', line 1290 def lrange(key, start, stop) synchronize do |client| client.call([:lrange, key, start, stop]) end end |
#lrem(key, count, value) ⇒ Integer
Remove elements from a list.
1305 1306 1307 1308 1309 |
# File 'lib/redis.rb', line 1305 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.
1317 1318 1319 1320 1321 |
# File 'lib/redis.rb', line 1317 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.
1329 1330 1331 1332 1333 |
# File 'lib/redis.rb', line 1329 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.
2199 2200 2201 2202 2203 2204 2205 2206 2207 |
# File 'lib/redis.rb', line 2199 def mapped_hmget(key, *fields) hmget(key, *fields) do |reply| if reply.kind_of?(Array) Hash[fields.zip(reply)] else reply end end end |
#mapped_hmset(key, hash) ⇒ String
Set one or more hash values.
2156 2157 2158 |
# File 'lib/redis.rb', line 2156 def mapped_hmset(key, hash) hmset(key, hash.to_a.flatten) end |
#mapped_mget(*keys) ⇒ Hash
Get the values of all the given keys.
945 946 947 948 949 950 951 952 953 |
# File 'lib/redis.rb', line 945 def mapped_mget(*keys) mget(*keys) do |reply| if reply.kind_of?(Array) Hash[keys.zip(reply)] else reply end end end |
#mapped_mset(hash) ⇒ String
Set one or more values.
875 876 877 |
# File 'lib/redis.rb', line 875 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.
905 906 907 |
# File 'lib/redis.rb', line 905 def mapped_msetnx(hash) msetnx(hash.to_a.flatten) end |
#mget(*keys, &blk) ⇒ Array<String>
Get the values of all the given keys.
929 930 931 932 933 |
# File 'lib/redis.rb', line 929 def mget(*keys, &blk) synchronize do |client| client.call([:mget] + keys, &blk) end end |
#migrate(key, options) ⇒ String
Transfer a key from the connected instance to another instance.
519 520 521 522 523 524 525 526 527 528 529 530 531 |
# File 'lib/redis.rb', line 519 def migrate(key, ) args = [:migrate] args << ([:host] || raise(':host not specified')) args << ([:port] || raise(':port not specified')) args << (key.is_a?(String) ? key : '') args << ([:db] || @client.db).to_i args << ([:timeout] || @client.timeout).to_i args << 'COPY' if [:copy] args << 'REPLACE' if [:replace] args += ['KEYS', *key] if key.is_a?(Array) synchronize { |client| client.call(args) } end |
#monitor {|line| ... } ⇒ Object
Listen for all requests received by the server in real time.
There is no way to interrupt this command.
320 321 322 323 324 |
# File 'lib/redis.rb', line 320 def monitor(&block) synchronize do |client| client.call_loop([:monitor], &block) end end |
#move(key, db) ⇒ Boolean
Move a key to another database.
598 599 600 601 602 |
# File 'lib/redis.rb', line 598 def move(key, db) synchronize do |client| client.call([:move, key, db], &Boolify) end end |
#mset(*args) ⇒ String
Set one or more values.
859 860 861 862 863 |
# File 'lib/redis.rb', line 859 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.
889 890 891 892 893 |
# File 'lib/redis.rb', line 889 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.
2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 |
# File 'lib/redis.rb', line 2454 def multi synchronize do |client| if !block_given? client.call([:multi]) else begin pipeline = Pipeline::Multi.new(@client) original, @client = @client, pipeline yield(self) original.call_pipeline(pipeline) ensure @client = original end end end end |
#object(*args) ⇒ Object
604 605 606 607 608 |
# File 'lib/redis.rb', line 604 def object(*args) synchronize do |client| client.call([:object] + args) end end |
#persist(key) ⇒ Boolean
Remove the expiration from a key.
395 396 397 398 399 |
# File 'lib/redis.rb', line 395 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.
446 447 448 449 450 |
# File 'lib/redis.rb', line 446 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.
457 458 459 460 461 |
# File 'lib/redis.rb', line 457 def pexpireat(key, ms_unix_time) synchronize do |client| client.call([:pexpireat, key, ms_unix_time], &Boolify) end end |
#pfadd(key, member) ⇒ Boolean
Add one or more members to a HyperLogLog structure.
2792 2793 2794 2795 2796 |
# File 'lib/redis.rb', line 2792 def pfadd(key, member) synchronize do |client| client.call([:pfadd, key, member], &Boolify) end end |
#pfcount(*keys) ⇒ Integer
Get the approximate cardinality of members added to HyperLogLog structure.
If called with multiple keys, returns the approximate cardinality of the union of the HyperLogLogs contained in the keys.
2805 2806 2807 2808 2809 |
# File 'lib/redis.rb', line 2805 def pfcount(*keys) synchronize do |client| client.call([:pfcount] + keys) end end |
#pfmerge(dest_key, *source_key) ⇒ Boolean
Merge multiple HyperLogLog values into an unique value that will approximate the cardinality of the union of the observed Sets of the source HyperLogLog structures.
2817 2818 2819 2820 2821 |
# File 'lib/redis.rb', line 2817 def pfmerge(dest_key, *source_key) synchronize do |client| client.call([:pfmerge, dest_key, *source_key], &BoolifySet) end end |
#ping(message = nil) ⇒ String
Ping the server.
152 153 154 155 156 |
# File 'lib/redis.rb', line 152 def ping( = nil) synchronize do |client| client.call([:ping, ].compact) end end |
#pipelined ⇒ Object
2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 |
# File 'lib/redis.rb', line 2411 def pipelined synchronize do |client| begin pipeline = Pipeline.new(@client) original, @client = @client, pipeline yield(self) original.call_pipeline(@client) ensure @client = original end end end |
#psetex(key, ttl, value) ⇒ String
Set the time to live in milliseconds of a key.
832 833 834 835 836 |
# File 'lib/redis.rb', line 832 def psetex(key, ttl, value) synchronize do |client| client.call([:psetex, key, ttl, value.to_s]) end end |
#psubscribe(*channels, &block) ⇒ Object
Listen for messages published to channels matching the given patterns.
2321 2322 2323 2324 2325 |
# File 'lib/redis.rb', line 2321 def psubscribe(*channels, &block) synchronize do |client| _subscription(:psubscribe, 0, channels, block) end end |
#psubscribe_with_timeout(timeout, *channels, &block) ⇒ Object
Listen for messages published to channels matching the given patterns. Throw a timeout error if there is no messages for a timeout period.
2328 2329 2330 2331 2332 |
# File 'lib/redis.rb', line 2328 def psubscribe_with_timeout(timeout, *channels, &block) synchronize do |client| _subscription(:psubscribe_with_timeout, timeout, channels, block) end end |
#pttl(key) ⇒ Integer
Get the time to live (in milliseconds) for a key.
In Redis 2.6 or older the command returns -1 if the key does not exist or if the key exist but has no associated expire.
Starting with Redis 2.8 the return value in case of error changed:
- The command returns -2 if the key does not exist.
- The command returns -1 if the key exists but has no associated expire.
474 475 476 477 478 |
# File 'lib/redis.rb', line 474 def pttl(key) synchronize do |client| client.call([:pttl, key]) end end |
#publish(channel, message) ⇒ Object
Post a message to a channel.
2286 2287 2288 2289 2290 |
# File 'lib/redis.rb', line 2286 def publish(channel, ) synchronize do |client| client.call([:publish, channel, ]) end end |
#pubsub(subcommand, *args) ⇒ Object
Inspect the state of the Pub/Sub subsystem. Possible subcommands: channels, numsub, numpat.
2344 2345 2346 2347 2348 |
# File 'lib/redis.rb', line 2344 def pubsub(subcommand, *args) synchronize do |client| client.call([:pubsub, subcommand] + args) end end |
#punsubscribe(*channels) ⇒ Object
Stop listening for messages posted to channels matching the given patterns.
2335 2336 2337 2338 2339 2340 |
# File 'lib/redis.rb', line 2335 def punsubscribe(*channels) synchronize do |client| raise RuntimeError, "Can't unsubscribe if not subscribed." unless subscribed? client.punsubscribe(*channels) end end |
#queue(*command) ⇒ Object
Queues a command for pipelining.
Commands in the queue are executed with the Redis#commit method.
See redis.io/topics/pipelining for more details.
97 98 99 100 101 |
# File 'lib/redis.rb', line 97 def queue(*command) synchronize do @queue[Thread.current.object_id] << command end end |
#quit ⇒ String
Close the connection.
171 172 173 174 175 176 177 178 179 180 |
# File 'lib/redis.rb', line 171 def quit synchronize do |client| begin client.call([:quit]) rescue ConnectionError ensure client.disconnect end end end |
#randomkey ⇒ String
Return a random key from the keyspace.
613 614 615 616 617 |
# File 'lib/redis.rb', line 613 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.
624 625 626 627 628 |
# File 'lib/redis.rb', line 624 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.
635 636 637 638 639 |
# File 'lib/redis.rb', line 635 def renamenx(old_name, new_name) synchronize do |client| client.call([:renamenx, old_name, new_name], &Boolify) end end |
#restore(key, ttl, serialized_value, options = {}) ⇒ String
Create a key using the serialized value, previously obtained using DUMP.
499 500 501 502 503 504 505 506 |
# File 'lib/redis.rb', line 499 def restore(key, ttl, serialized_value, = {}) args = [:restore, key, ttl, serialized_value] args << 'REPLACE' if [:replace] synchronize do |client| client.call(args) end end |
#rpop(key) ⇒ String
Remove and get the last element in a list.
1150 1151 1152 1153 1154 |
# File 'lib/redis.rb', line 1150 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.
1161 1162 1163 1164 1165 |
# File 'lib/redis.rb', line 1161 def rpoplpush(source, destination) synchronize do |client| client.call([:rpoplpush, source, destination]) end end |
#rpush(key, value) ⇒ Integer
Append one or more values to a list, creating the list if it doesn’t exist
1119 1120 1121 1122 1123 |
# File 'lib/redis.rb', line 1119 def rpush(key, value) synchronize do |client| client.call([:rpush, key, value]) end end |
#rpushx(key, value) ⇒ Integer
Append a value to a list, only if the list exists.
1130 1131 1132 1133 1134 |
# File 'lib/redis.rb', line 1130 def rpushx(key, value) synchronize do |client| client.call([:rpushx, key, value]) end end |
#sadd(key, member) ⇒ Boolean, Integer
Add one or more members to a set.
1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 |
# File 'lib/redis.rb', line 1353 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 |
#save ⇒ String
Synchronously save the dataset to disk.
329 330 331 332 333 |
# File 'lib/redis.rb', line 329 def save synchronize do |client| client.call([:save]) end end |
#scan(cursor, options = {}) ⇒ String+
Scan the keyspace
2645 2646 2647 |
# File 'lib/redis.rb', line 2645 def scan(cursor, ={}) _scan(:scan, cursor, [], ) end |
#scan_each(options = {}, &block) ⇒ Enumerator
Scan the keyspace
2664 2665 2666 2667 2668 2669 2670 2671 2672 |
# File 'lib/redis.rb', line 2664 def scan_each(={}, &block) return to_enum(:scan_each, ) unless block_given? cursor = 0 loop do cursor, keys = scan(cursor, ) keys.each(&block) break if cursor == "0" end end |
#scard(key) ⇒ Integer
Get the number of members in a set.
1339 1340 1341 1342 1343 |
# File 'lib/redis.rb', line 1339 def scard(key) synchronize do |client| client.call([:scard, key]) end end |
#script(subcommand, *args) ⇒ String, ...
Control remote script registry.
2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 |
# File 'lib/redis.rb', line 2525 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.
1456 1457 1458 1459 1460 |
# File 'lib/redis.rb', line 1456 def sdiff(*keys) synchronize do |client| client.call([:sdiff] + keys) end end |
#sdiffstore(destination, *keys) ⇒ Integer
Subtract multiple sets and store the resulting set in a key.
1467 1468 1469 1470 1471 |
# File 'lib/redis.rb', line 1467 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.
141 142 143 144 145 146 |
# File 'lib/redis.rb', line 141 def select(db) synchronize do |client| client.db = db client.call([:select, db]) end end |
#sentinel(subcommand, *args) ⇒ Array<String>, ...
Interact with the sentinel command (masters, master, slaves, failover)
3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 |
# File 'lib/redis.rb', line 3229 def sentinel(subcommand, *args) subcommand = subcommand.to_s.downcase synchronize do |client| client.call([:sentinel, subcommand] + args) do |reply| case subcommand when "get-master-addr-by-name" reply else if reply.kind_of?(Array) if reply[0].kind_of?(Array) reply.map(&Hashify) else Hashify.call(reply) end else reply end end end end end |
#set(key, value, options = {}) ⇒ String, Boolean
Set the string value of a key.
790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 |
# File 'lib/redis.rb', line 790 def set(key, value, = {}) args = [] ex = [:ex] args.concat(["EX", ex]) if ex px = [:px] args.concat(["PX", px]) if px nx = [:nx] args.concat(["NX"]) if nx xx = [:xx] args.concat(["XX"]) if xx synchronize do |client| if nx || xx client.call([:set, key, value.to_s] + args, &BoolifySet) else client.call([:set, key, value.to_s] + args) end end end |
#setbit(key, offset, value) ⇒ Integer
Sets or clears the bit at offset in the string value stored at key.
986 987 988 989 990 |
# File 'lib/redis.rb', line 986 def setbit(key, offset, value) synchronize do |client| client.call([:setbit, key, offset, value]) end end |
#setex(key, ttl, value) ⇒ String
Set the time to live in seconds of a key.
820 821 822 823 824 |
# File 'lib/redis.rb', line 820 def setex(key, ttl, value) synchronize do |client| client.call([:setex, key, ttl, value.to_s]) end end |
#setnx(key, value) ⇒ Boolean
Set the value of a key, only if the key does not exist.
843 844 845 846 847 |
# File 'lib/redis.rb', line 843 def setnx(key, value) synchronize do |client| client.call([:setnx, key, value.to_s], &Boolify) end end |
#setrange(key, offset, value) ⇒ Integer
Overwrite part of a string at key starting at the specified offset.
961 962 963 964 965 |
# File 'lib/redis.rb', line 961 def setrange(key, offset, value) synchronize do |client| client.call([:setrange, key, offset, value.to_s]) end end |
#shutdown ⇒ Object
Synchronously save the dataset to disk and then shut down the server.
336 337 338 339 340 341 342 343 344 345 346 347 |
# File 'lib/redis.rb', line 336 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.
1477 1478 1479 1480 1481 |
# File 'lib/redis.rb', line 1477 def sinter(*keys) synchronize do |client| client.call([:sinter] + keys) end end |
#sinterstore(destination, *keys) ⇒ Integer
Intersect multiple sets and store the resulting set in a key.
1488 1489 1490 1491 1492 |
# File 'lib/redis.rb', line 1488 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.
1436 1437 1438 1439 1440 |
# File 'lib/redis.rb', line 1436 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.
350 351 352 353 354 |
# File 'lib/redis.rb', line 350 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)
361 362 363 364 365 366 367 |
# File 'lib/redis.rb', line 361 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.
1446 1447 1448 1449 1450 |
# File 'lib/redis.rb', line 1446 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.
1425 1426 1427 1428 1429 |
# File 'lib/redis.rb', line 1425 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.
666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 |
# File 'lib/redis.rb', line 666 def sort(key, = {}) args = [] by = [:by] args.concat(["BY", by]) if by limit = [:limit] args.concat(["LIMIT"] + limit) if limit get = Array([:get]) args.concat(["GET"].product(get).flatten) unless get.empty? order = [:order] args.concat(order.split(" ")) if order store = [:store] args.concat(["STORE", store]) if store synchronize do |client| client.call([:sort, key] + args) do |reply| if get.size > 1 && !store if reply reply.each_slice(get.size).to_a end else reply end end end end |
#spop(key, count = nil) ⇒ String
Remove and return one or more random member from a set.
1394 1395 1396 1397 1398 1399 1400 1401 1402 |
# File 'lib/redis.rb', line 1394 def spop(key, count = nil) synchronize do |client| if count.nil? client.call([:spop, key]) else client.call([:spop, key, count]) end end end |
#srandmember(key, count = nil) ⇒ String
Get one or more random members from a set.
1409 1410 1411 1412 1413 1414 1415 1416 1417 |
# File 'lib/redis.rb', line 1409 def srandmember(key, count = nil) synchronize do |client| if count.nil? client.call([:srandmember, key]) else client.call([:srandmember, key, count]) end end end |
#srem(key, member) ⇒ Boolean, Integer
Remove one or more members from a set.
1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 |
# File 'lib/redis.rb', line 1375 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 |
#sscan(key, cursor, options = {}) ⇒ String+
Scan a set
2762 2763 2764 |
# File 'lib/redis.rb', line 2762 def sscan(key, cursor, ={}) _scan(:sscan, cursor, [key], ) end |
#sscan_each(key, options = {}, &block) ⇒ Enumerator
Scan a set
2777 2778 2779 2780 2781 2782 2783 2784 2785 |
# File 'lib/redis.rb', line 2777 def sscan_each(key, ={}, &block) return to_enum(:sscan_each, key, ) unless block_given? cursor = 0 loop do cursor, keys = sscan(key, cursor, ) keys.each(&block) break if cursor == "0" end end |
#strlen(key) ⇒ Integer
Get the length of the value stored in a key.
1076 1077 1078 1079 1080 |
# File 'lib/redis.rb', line 1076 def strlen(key) synchronize do |client| client.call([:strlen, key]) end end |
#subscribe(*channels, &block) ⇒ Object
Listen for messages published to the given channels.
2299 2300 2301 2302 2303 |
# File 'lib/redis.rb', line 2299 def subscribe(*channels, &block) synchronize do |client| _subscription(:subscribe, 0, channels, block) end end |
#subscribe_with_timeout(timeout, *channels, &block) ⇒ Object
Listen for messages published to the given channels. Throw a timeout error if there is no messages for a timeout period.
2306 2307 2308 2309 2310 |
# File 'lib/redis.rb', line 2306 def subscribe_with_timeout(timeout, *channels, &block) synchronize do |client| _subscription(:subscribe_with_timeout, timeout, channels, block) end end |
#subscribed? ⇒ Boolean
2292 2293 2294 2295 2296 |
# File 'lib/redis.rb', line 2292 def subscribed? synchronize do |client| client.kind_of? SubscribedClient end end |
#sunion(*keys) ⇒ Array<String>
Add multiple sets.
1498 1499 1500 1501 1502 |
# File 'lib/redis.rb', line 1498 def sunion(*keys) synchronize do |client| client.call([:sunion] + keys) end end |
#sunionstore(destination, *keys) ⇒ Integer
Add multiple sets and store the resulting set in a key.
1509 1510 1511 1512 1513 |
# File 'lib/redis.rb', line 1509 def sunionstore(destination, *keys) synchronize do |client| client.call([:sunionstore, destination] + keys) end end |
#sync ⇒ Object
Internal command used for replication.
370 371 372 373 374 |
# File 'lib/redis.rb', line 370 def sync synchronize do |client| client.call([:sync]) end end |
#synchronize ⇒ Object
50 51 52 |
# File 'lib/redis.rb', line 50 def synchronize mon_synchronize { yield(@client) } end |
#time ⇒ Array<Integer>
Return the server time.
383 384 385 386 387 388 389 |
# File 'lib/redis.rb', line 383 def time synchronize do |client| client.call([:time]) do |reply| reply.map(&:to_i) if reply end end end |
#ttl(key) ⇒ Integer
Get the time to live (in seconds) for a key.
In Redis 2.6 or older the command returns -1 if the key does not exist or if the key exist but has no associated expire.
Starting with Redis 2.8 the return value in case of error changed:
- The command returns -2 if the key does not exist.
- The command returns -1 if the key exists but has no associated expire.
435 436 437 438 439 |
# File 'lib/redis.rb', line 435 def ttl(key) synchronize do |client| client.call([:ttl, key]) end end |
#type(key) ⇒ String
Determine the type stored at key.
701 702 703 704 705 |
# File 'lib/redis.rb', line 701 def type(key) synchronize do |client| client.call([:type, key]) end end |
#unlink(*keys) ⇒ Integer
Unlink one or more keys.
547 548 549 550 551 |
# File 'lib/redis.rb', line 547 def unlink(*keys) synchronize do |client| client.call([:unlink] + keys) end end |
#unsubscribe(*channels) ⇒ Object
Stop listening for messages posted to the given channels.
2313 2314 2315 2316 2317 2318 |
# File 'lib/redis.rb', line 2313 def unsubscribe(*channels) synchronize do |client| raise RuntimeError, "Can't unsubscribe if not subscribed." unless subscribed? client.unsubscribe(*channels) end end |
#unwatch ⇒ String
Forget about all watched keys.
2405 2406 2407 2408 2409 |
# File 'lib/redis.rb', line 2405 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.
2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 |
# File 'lib/redis.rb', line 2380 def watch(*keys) synchronize do |client| res = client.call([:watch] + keys) if block_given? begin yield(self) rescue ConnectionError raise rescue StandardError unwatch raise end else res end end end |
#with_reconnect(val = true, &blk) ⇒ Object
Run code with the client reconnecting
55 56 57 58 59 |
# File 'lib/redis.rb', line 55 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
62 63 64 |
# File 'lib/redis.rb', line 62 def without_reconnect(&blk) with_reconnect(false, &blk) end |
#xack(key, group, *ids) ⇒ Integer
Removes one or multiple entries from the pending entries list of a stream consumer group.
3144 3145 3146 3147 |
# File 'lib/redis.rb', line 3144 def xack(key, group, *ids) args = [:xack, key, group].concat(ids.flatten) synchronize { |client| client.call(args) } end |
#xadd(key, entry, opts = {}) ⇒ String
Add new entry to the stream.
2948 2949 2950 2951 2952 2953 2954 |
# File 'lib/redis.rb', line 2948 def xadd(key, entry, opts = {}) args = [:xadd, key] args.concat(['MAXLEN', (opts[:approximate] ? '~' : nil), opts[:maxlen]].compact) if opts[:maxlen] args << (opts[:id] || '*') args.concat(entry.to_a.flatten) synchronize { |client| client.call(args) } end |
#xclaim(key, group, consumer, min_idle_time, *ids, **opts) ⇒ Hash{String => Hash}, Array<String>
Changes the ownership of a pending entry
3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 |
# File 'lib/redis.rb', line 3181 def xclaim(key, group, consumer, min_idle_time, *ids, **opts) args = [:xclaim, key, group, consumer, min_idle_time].concat(ids.flatten) args.concat(['IDLE', opts[:idle].to_i]) if opts[:idle] args.concat(['TIME', opts[:time].to_i]) if opts[:time] args.concat(['RETRYCOUNT', opts[:retrycount]]) if opts[:retrycount] args << 'FORCE' if opts[:force] args << 'JUSTID' if opts[:justid] blk = opts[:justid] ? Noop : HashifyStreamEntries synchronize { |client| client.call(args, &blk) } end |
#xdel(key, *ids) ⇒ Integer
Delete entries by entry ids.
2984 2985 2986 2987 |
# File 'lib/redis.rb', line 2984 def xdel(key, *ids) args = [:xdel, key].concat(ids.flatten) synchronize { |client| client.call(args) } end |
#xgroup(subcommand, key, group, id_or_consumer = nil, mkstream: false) ⇒ String, Integer
Manages the consumer group of the stream.
3092 3093 3094 3095 |
# File 'lib/redis.rb', line 3092 def xgroup(subcommand, key, group, id_or_consumer = nil, mkstream: false) args = [:xgroup, subcommand, key, group, id_or_consumer, (mkstream ? 'MKSTREAM' : nil)].compact synchronize { |client| client.call(args) } end |
#xinfo(subcommand, key, group = nil) ⇒ Hash+
Returns the stream information each subcommand.
2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 |
# File 'lib/redis.rb', line 2919 def xinfo(subcommand, key, group = nil) args = [:xinfo, subcommand, key, group].compact synchronize do |client| client.call(args) do |reply| case subcommand.to_s.downcase when 'stream' then Hashify.call(reply) when 'groups', 'consumers' then reply.map { |arr| Hashify.call(arr) } else reply end end end end |
#xlen(key) ⇒ Integer
Returns the number of entries inside a stream.
3043 3044 3045 |
# File 'lib/redis.rb', line 3043 def xlen(key) synchronize { |client| client.call([:xlen, key]) } end |
#xpending(key, group, *args) ⇒ Hash+
Fetches not acknowledging pending entries
3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 |
# File 'lib/redis.rb', line 3210 def xpending(key, group, *args) command_args = [:xpending, key, group] case args.size when 0, 3, 4 command_args.concat(args) else raise ArgumentError, "wrong number of arguments (given #{args.size + 2}, expected 2, 5 or 6)" end summary_needed = args.empty? blk = summary_needed ? HashifyStreamPendings : HashifyStreamPendingDetails synchronize { |client| client.call(command_args, &blk) } end |
#xrange(key, start = '-', _end = '+', count: nil) ⇒ Array<Array<String, Hash>>
Fetches entries of the stream in ascending order.
3006 3007 3008 3009 3010 |
# File 'lib/redis.rb', line 3006 def xrange(key, start = '-', _end = '+', count: nil) args = [:xrange, key, start, _end] args.concat(['COUNT', count]) if count synchronize { |client| client.call(args, &HashifyStreamEntries) } end |
#xread(keys, ids, count: nil, block: nil) ⇒ Hash{String => Hash{String => Hash}}
Fetches entries from one or multiple streams. Optionally blocking.
3064 3065 3066 3067 3068 3069 |
# File 'lib/redis.rb', line 3064 def xread(keys, ids, count: nil, block: nil) args = [:xread] args << 'COUNT' << count if count args << 'BLOCK' << block.to_i if block _xread(args, keys, ids, block) end |
#xreadgroup(group, consumer, keys, ids, opts = {}) ⇒ Hash{String => Hash{String => Hash}}
Fetches a subset of the entries from one or multiple streams related with the consumer group. Optionally blocking.
3122 3123 3124 3125 3126 3127 3128 |
# File 'lib/redis.rb', line 3122 def xreadgroup(group, consumer, keys, ids, opts = {}) args = [:xreadgroup, 'GROUP', group, consumer] args << 'COUNT' << opts[:count] if opts[:count] args << 'BLOCK' << opts[:block].to_i if opts[:block] args << 'NOACK' if opts[:noack] _xread(args, keys, ids, opts[:block]) end |
#xrevrange(key, _end = '+', start = '-', count: nil) ⇒ Array<Array<String, Hash>>
Fetches entries of the stream in descending order.
3029 3030 3031 3032 3033 |
# File 'lib/redis.rb', line 3029 def xrevrange(key, _end = '+', start = '-', count: nil) args = [:xrevrange, key, _end, start] args.concat(['COUNT', count]) if count synchronize { |client| client.call(args, &HashifyStreamEntries) } end |
#xtrim(key, maxlen, approximate: false) ⇒ Integer
Trims older entries of the stream if needed.
2968 2969 2970 2971 |
# File 'lib/redis.rb', line 2968 def xtrim(key, maxlen, approximate: false) args = [:xtrim, key, 'MAXLEN', (approximate ? '~' : nil), maxlen].compact synchronize { |client| client.call(args) } end |
#zadd(key, *args) ⇒ Boolean, ...
Add one or more members to a sorted set, or update the score for members that already exist.
1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 |
# File 'lib/redis.rb', line 1560 def zadd(key, *args) #, options = [] if args.last.is_a?(Hash) = args.pop nx = [:nx] << "NX" if nx xx = [:xx] << "XX" if xx ch = [:ch] << "CH" if ch incr = [:incr] << "INCR" if incr end synchronize do |client| if args.size == 1 && args[0].is_a?(Array) # Variadic: return float if INCR, integer if !INCR client.call([:zadd, key] + + args[0], &(incr ? Floatify : nil)) elsif args.size == 2 # Single pair: return float if INCR, boolean if !INCR client.call([:zadd, key] + + args, &(incr ? Floatify : Boolify)) else raise ArgumentError, "wrong number of arguments" end end end |
#zcard(key) ⇒ Integer
Get the number of members in a sorted set.
1523 1524 1525 1526 1527 |
# File 'lib/redis.rb', line 1523 def zcard(key) synchronize do |client| client.call([:zcard, key]) end end |
#zcount(key, min, max) ⇒ Integer
Count the members in a sorted set with scores within the given values.
2033 2034 2035 2036 2037 |
# File 'lib/redis.rb', line 2033 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.
1601 1602 1603 1604 1605 |
# File 'lib/redis.rb', line 1601 def zincrby(key, increment, member) synchronize do |client| client.call([:zincrby, key, increment, member], &Floatify) end end |
#zinterstore(destination, keys, options = {}) ⇒ Integer
Intersect multiple sorted sets and store the resulting sorted set in a new key.
2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 |
# File 'lib/redis.rb', line 2053 def zinterstore(destination, keys, = {}) args = [] weights = [:weights] args.concat(["WEIGHTS"] + weights) if weights aggregate = [:aggregate] args.concat(["AGGREGATE", aggregate]) if aggregate synchronize do |client| client.call([:zinterstore, destination, keys.size] + keys + args) end end |
#zlexcount(key, min, max) ⇒ Integer
Count the members, with the same score in a sorted set, within the given lexicographical range.
1856 1857 1858 1859 1860 |
# File 'lib/redis.rb', line 1856 def zlexcount(key, min, max) synchronize do |client| client.call([:zlexcount, key, min, max]) end end |
#zpopmax(key, count = nil) ⇒ Array<String, Float>+
Removes and returns up to count members with the highest scores in the sorted set stored at key.
1652 1653 1654 1655 1656 1657 |
# File 'lib/redis.rb', line 1652 def zpopmax(key, count = nil) synchronize do |client| members = client.call([:zpopmax, key, count].compact, &FloatifyPairs) count.to_i > 1 ? members : members.first end end |
#zpopmin(key, count = nil) ⇒ Array<String, Float>+
Removes and returns up to count members with the lowest scores in the sorted set stored at key.
1673 1674 1675 1676 1677 1678 |
# File 'lib/redis.rb', line 1673 def zpopmin(key, count = nil) synchronize do |client| members = client.call([:zpopmin, key, count].compact, &FloatifyPairs) count.to_i > 1 ? members : members.first end end |
#zrange(key, start, stop, options = {}) ⇒ Array<String>, Array<[String, Float]>
Return a range of members in a sorted set, by index.
1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 |
# File 'lib/redis.rb', line 1755 def zrange(key, start, stop, = {}) args = [] with_scores = [:with_scores] || [:withscores] if with_scores args << "WITHSCORES" block = FloatifyPairs end synchronize do |client| client.call([:zrange, key, start, stop] + args, &block) end end |
#zrangebylex(key, min, max, options = {}) ⇒ Array<String>, Array<[String, Float]>
Return a range of members with the same score in a sorted set, by lexicographical ordering
1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 |
# File 'lib/redis.rb', line 1883 def zrangebylex(key, min, max, = {}) args = [] limit = [:limit] args.concat(["LIMIT"] + limit) if limit synchronize do |client| client.call([:zrangebylex, key, min, max] + args) end end |
#zrangebyscore(key, min, max, options = {}) ⇒ Array<String>, Array<[String, Float]>
Return a range of members in a sorted set, by score.
1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 |
# File 'lib/redis.rb', line 1943 def zrangebyscore(key, min, max, = {}) args = [] with_scores = [:with_scores] || [:withscores] if with_scores args << "WITHSCORES" block = FloatifyPairs end limit = [:limit] args.concat(["LIMIT"] + limit) if limit synchronize do |client| client.call([:zrangebyscore, key, min, max] + args, &block) end end |
#zrank(key, member) ⇒ Integer
Determine the index of a member in a sorted set.
1801 1802 1803 1804 1805 |
# File 'lib/redis.rb', line 1801 def zrank(key, member) synchronize do |client| client.call([:zrank, key, member]) end end |
#zrem(key, member) ⇒ Boolean, Integer
Remove one or more members from a sorted set.
1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 |
# File 'lib/redis.rb', line 1624 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) ⇒ Integer
Remove all members in a sorted set within the given indexes.
1832 1833 1834 1835 1836 |
# File 'lib/redis.rb', line 1832 def zremrangebyrank(key, start, stop) synchronize do |client| client.call([:zremrangebyrank, key, start, stop]) end end |
#zremrangebyscore(key, min, max) ⇒ Integer
Remove all members in a sorted set within the given scores.
2010 2011 2012 2013 2014 |
# File 'lib/redis.rb', line 2010 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.
1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 |
# File 'lib/redis.rb', line 1781 def zrevrange(key, start, stop, = {}) args = [] with_scores = [:with_scores] || [:withscores] if with_scores args << "WITHSCORES" block = FloatifyPairs end synchronize do |client| client.call([:zrevrange, key, start, stop] + args, &block) end end |
#zrevrangebylex(key, max, min, options = {}) ⇒ Object
Return a range of members with the same score in a sorted set, by reversed lexicographical ordering. Apart from the reversed ordering, #zrevrangebylex is similar to #zrangebylex.
1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 |
# File 'lib/redis.rb', line 1905 def zrevrangebylex(key, max, min, = {}) args = [] limit = [:limit] args.concat(["LIMIT"] + limit) if limit synchronize do |client| client.call([:zrevrangebylex, key, max, min] + args) 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.
1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 |
# File 'lib/redis.rb', line 1975 def zrevrangebyscore(key, max, min, = {}) args = [] with_scores = [:with_scores] || [:withscores] if with_scores args << ["WITHSCORES"] block = FloatifyPairs end limit = [:limit] args.concat(["LIMIT"] + limit) if limit synchronize do |client| client.call([:zrevrangebyscore, key, max, min] + args, &block) end end |
#zrevrank(key, member) ⇒ Integer
Determine the index of a member in a sorted set, with scores ordered from high to low.
1813 1814 1815 1816 1817 |
# File 'lib/redis.rb', line 1813 def zrevrank(key, member) synchronize do |client| client.call([:zrevrank, key, member]) end end |
#zscan(key, cursor, options = {}) ⇒ String, Array<[String, Float]>
Scan a sorted set
2724 2725 2726 2727 2728 |
# File 'lib/redis.rb', line 2724 def zscan(key, cursor, ={}) _scan(:zscan, cursor, [key], ) do |reply| [reply[0], FloatifyPairs.call(reply[1])] end end |
#zscan_each(key, options = {}, &block) ⇒ Enumerator
Scan a sorted set
2741 2742 2743 2744 2745 2746 2747 2748 2749 |
# File 'lib/redis.rb', line 2741 def zscan_each(key, ={}, &block) return to_enum(:zscan_each, key, ) unless block_given? cursor = 0 loop do cursor, values = zscan(key, cursor, ) values.each(&block) break if cursor == "0" end end |
#zscore(key, member) ⇒ Float
Get the score associated with the given member in a sorted set.
1731 1732 1733 1734 1735 |
# File 'lib/redis.rb', line 1731 def zscore(key, member) synchronize do |client| client.call([:zscore, key, member], &Floatify) end end |
#zunionstore(destination, keys, options = {}) ⇒ Integer
Add multiple sorted sets and store the resulting sorted set in a new key.
2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 |
# File 'lib/redis.rb', line 2080 def zunionstore(destination, keys, = {}) args = [] weights = [:weights] args.concat(["WEIGHTS"] + weights) if weights aggregate = [:aggregate] args.concat(["AGGREGATE", aggregate]) if aggregate synchronize do |client| client.call([:zunionstore, destination, keys.size] + keys + args) end end |