Module: Valkey::Commands::ListCommands

Included in:
Valkey::Commands
Defined in:
lib/valkey/commands/list_commands.rb

Overview

this module contains commands related to list data type.

Instance Method Summary collapse

Instance Method Details

#blmove(source, destination, where_source, where_destination, timeout: 0) ⇒ nil, String

Remove the first/last element in a list and append/prepend it to another list and return it, or block until one is available.

Examples:

With timeout

element = valkey.blmove("foo", "bar", "LEFT", "RIGHT", timeout: 5)
  # => nil on timeout
  # => "element" on success

Without timeout

element = valkey.blmove("foo", "bar", "LEFT", "RIGHT")
  # => "element"

Parameters:

  • source (String)

    source key

  • destination (String)

    destination key

  • where_source (String, Symbol)

    from where to remove the element from the source list e.g. ‘LEFT’ - from head, ‘RIGHT’ - from tail

  • where_destination (String, Symbol)

    where to push the element to the source list e.g. ‘LEFT’ - to head, ‘RIGHT’ - to tail

  • options (Hash)
    • ‘:timeout => [Float, Integer]`: timeout in seconds, defaults to no timeout

Returns:

  • (nil, String)

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



59
60
61
62
63
64
# File 'lib/valkey/commands/list_commands.rb', line 59

def blmove(source, destination, where_source, where_destination, timeout: 0)
  where_source, where_destination = _normalize_move_wheres(where_source, where_destination)

  args = [:blmove, source, destination, where_source, where_destination, timeout]
  send_command(RequestType::BLMOVE, args)
end

#blmpop(timeout, *keys, modifier: "LEFT", count: nil) ⇒ Array<String, Array<String, Float>>

Pops one or more elements from the first non-empty list key from the list of provided key names. If lists are empty, blocks until timeout has passed.

Examples:

Popping a element

valkey.blmpop(1.0, 'list')
#=> ['list', ['a']]

With count option

valkey.blmpop(1.0, 'list', count: 2)
#=> ['list', ['a', 'b']]

Returns:

  • (Array<String, Array<String, Float>>)

    list of popped elements or nil

Raises:

  • (ArgumentError)


213
214
215
216
217
218
219
220
# File 'lib/valkey/commands/list_commands.rb', line 213

def blmpop(timeout, *keys, modifier: "LEFT", count: nil)
  raise ArgumentError, "Pick either LEFT or RIGHT" unless %w[LEFT RIGHT].include?(modifier)

  args = [timeout, keys.size, *keys, modifier]
  args << "COUNT" << Integer(count) if count

  send_command(RequestType::BLMPOP, args)
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 = valkey.blpop("list", :timeout => 5)
  # => nil on timeout
  # => ["list", "element"] on success

Without timeout

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

Blocking pop on multiple lists

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

Parameters:

  • keys (String, Array<String>)

    one or more keys to perform the blocking pop on

  • options (Hash)
    • ‘:timeout => [Float, Integer]`: 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



158
159
160
# File 'lib/valkey/commands/list_commands.rb', line 158

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 => [Float, Integer]`: 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:



174
175
176
# File 'lib/valkey/commands/list_commands.rb', line 174

def brpop(*args)
  _bpop(RequestType::BRPOP, args.flatten)
end

#brpoplpush(source, destination, timeout: 0) ⇒ 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)
    • ‘:timeout => [Float, Integer]`: timeout in seconds, defaults to no timeout

Returns:

  • (nil, String)
    • ‘nil` when the operation timed out

    • the element was popped and pushed otherwise



189
190
191
192
# File 'lib/valkey/commands/list_commands.rb', line 189

def brpoplpush(source, destination, timeout: 0)
  args = [:brpoplpush, source, destination, timeout]
  send_blocking_command(RequestType::BRPOPLPUSH, args, timeout)
end

#lindex(key, index) ⇒ String

Get an element from a list by its index.

Parameters:

  • key (String)
  • index (Integer)

Returns:

  • (String)


255
256
257
# File 'lib/valkey/commands/list_commands.rb', line 255

def lindex(key, index)
  send_command(RequestType::LINDEX, [key, Integer(index)])
end

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

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:

  • (Integer)

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



267
268
269
# File 'lib/valkey/commands/list_commands.rb', line 267

def linsert(key, where, pivot, value)
  send_command(RequestType::LINSERT, [key, where, pivot, value])
end

#llen(key) ⇒ Integer

Get the length of a list.

Parameters:

  • key (String)

Returns:

  • (Integer)


14
15
16
# File 'lib/valkey/commands/list_commands.rb', line 14

def llen(key)
  send_command(RequestType::LLEN, [key])
end

#lmove(source, destination, where_source, where_destination) ⇒ nil, String

Note:

This command comes in place of the now deprecated RPOPLPUSH. Doing LMOVE RIGHT LEFT is equivalent.

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

Parameters:

  • source (String)

    source key

  • destination (String)

    destination key

  • where_source (String, Symbol)

    from where to remove the element from the source list e.g. ‘LEFT’ - from head, ‘RIGHT’ - from tail

  • where_destination (String, Symbol)

    where to push the element to the source list e.g. ‘LEFT’ - to head, ‘RIGHT’ - to tail

Returns:

  • (nil, String)

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



31
32
33
34
35
# File 'lib/valkey/commands/list_commands.rb', line 31

def lmove(source, destination, where_source, where_destination)
  where_source, where_destination = _normalize_move_wheres(where_source, where_destination)

  send_command(RequestType::LMOVE, [source, destination, where_source, where_destination])
end

#lmpop(*keys, modifier: "LEFT", count: nil) ⇒ Array<String, Array<String, Float>>

Pops one or more elements from the first non-empty list key from the list of provided key names.

Examples:

Popping a element

valkey.lmpop('list')
#=> ['list', ['a']]

With count option

valkey.lmpop('list', count: 2)
#=> ['list', ['a', 'b']]

Returns:

  • (Array<String, Array<String, Float>>)

    list of popped elements or nil

Raises:

  • (ArgumentError)


239
240
241
242
243
244
245
246
247
248
# File 'lib/valkey/commands/list_commands.rb', line 239

def lmpop(*keys, modifier: "LEFT", count: nil)
  raise ArgumentError, "Pick either LEFT or RIGHT" unless %w[LEFT RIGHT].include?(modifier)

  args = [keys.size, *keys, modifier]
  args << "COUNT" << Integer(count) if count

  # pp args

  send_command(RequestType::LMPOP, args)
end

#lpop(key, count = nil) ⇒ nil, ...

Remove and get the first elements in a list.

Parameters:

  • key (String)
  • count (Integer) (defaults to: nil)

    number of elements to remove

Returns:

  • (nil, String, Array<String>)

    the values of the first elements



111
112
113
114
115
# File 'lib/valkey/commands/list_commands.rb', line 111

def lpop(key, count = nil)
  args = [key]
  args << Integer(count) if count
  send_command(RequestType::LPOP, args)
end

#lpush(key, value) ⇒ Integer

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

Parameters:

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

    string value, or array of string values to push

Returns:

  • (Integer)

    the length of the list after the push operation



71
72
73
# File 'lib/valkey/commands/list_commands.rb', line 71

def lpush(key, value)
  send_command(RequestType::LPUSH, [key, *value])
end

#lpushx(key, value) ⇒ Integer

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

Parameters:

  • key (String)
  • value (String)

Returns:

  • (Integer)

    the length of the list after the push operation



80
81
82
# File 'lib/valkey/commands/list_commands.rb', line 80

def lpushx(key, value)
  send_command(RequestType::LPUSHX, [key, value])
end

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

Get a range of elements from a list.

Parameters:

  • key (String)
  • start (Integer)

    start index

  • stop (Integer)

    stop index

Returns:

  • (Array<String>)


277
278
279
# File 'lib/valkey/commands/list_commands.rb', line 277

def lrange(key, start, stop)
  send_command(RequestType::LRANGE, [key, Integer(start), Integer(stop)])
end

#lrem(key, count, value) ⇒ Integer

Remove elements from a list.

Parameters:

  • key (String)
  • count (Integer)

    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:

  • (Integer)

    the number of removed elements



290
291
292
# File 'lib/valkey/commands/list_commands.rb', line 290

def lrem(key, count, value)
  send_command(RequestType::LREM, [key, Integer(count), value])
end

#lset(key, index, value) ⇒ String

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

Parameters:

  • key (String)
  • index (Integer)
  • value (String)

Returns:

  • (String)

    ‘OK`



300
301
302
# File 'lib/valkey/commands/list_commands.rb', line 300

def lset(key, index, value)
  send_command(RequestType::LSET, [key, Integer(index), value])
end

#ltrim(key, start, stop) ⇒ String

Trim a list to the specified range.

Parameters:

  • key (String)
  • start (Integer)

    start index

  • stop (Integer)

    stop index

Returns:

  • (String)

    ‘OK`



310
311
312
# File 'lib/valkey/commands/list_commands.rb', line 310

def ltrim(key, start, stop)
  send_command(RequestType::LTRIM, [key, Integer(start), Integer(stop)])
end

#rpop(key, count = nil) ⇒ nil, ...

Remove and get the last elements in a list.

Parameters:

  • key (String)
  • count (Integer) (defaults to: nil)

    number of elements to remove

Returns:

  • (nil, String, Array<String>)

    the values of the last elements



122
123
124
125
126
# File 'lib/valkey/commands/list_commands.rb', line 122

def rpop(key, count = nil)
  args = [key]
  args << Integer(count) if count
  send_command(RequestType::RPOP, args)
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



133
134
135
# File 'lib/valkey/commands/list_commands.rb', line 133

def rpoplpush(source, destination)
  send_command(RequestType::RPOPLPUSH, [source, destination])
end

#rpush(key, value) ⇒ Integer

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

Parameters:

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

    string value, or array of string values to push

Returns:

  • (Integer)

    the length of the list after the push operation



89
90
91
92
93
94
95
# File 'lib/valkey/commands/list_commands.rb', line 89

def rpush(key, value)
  value = [value] unless value.is_a?(Array)

  args = [key] + value

  send_command(RequestType::RPUSH, args)
end

#rpushx(key, value) ⇒ Integer

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

Parameters:

  • key (String)
  • value (String)

Returns:

  • (Integer)

    the length of the list after the push operation



102
103
104
# File 'lib/valkey/commands/list_commands.rb', line 102

def rpushx(key, value)
  send_command(RequestType::RPUSHX, [key, value])
end