SRANDMEMBER
SRANDMEMBER
SRANDMEMBER key [count]
- Доступно с версии:
- 1.0.0
- Временная сложность:
- Без аргумента count O(1), в противном случае O(N), где N — абсолютное значение переданного count.
- Категории ACL:
-
@read,@set,@slow,
При вызове только с аргументом key, возвращает случайный элемент из множества, хранящегося в key.
Если переданный аргумент count положительный, возвращает массив различных элементов. Длина массива — либо count, либо мощность множества (SCARD), что меньше.
Если переданный аргумент count отрицательный, поведение меняется, и команда допускает возврат того же элемента несколько раз. В этом случае количество возвращаемых элементов равно абсолютному значению указанного аргумента count.
Возврат
Ответ в формате Bulk string: без дополнительного аргумента count, команда возвращает Bulk Reply со случайным выбранным элементом или nil, если key не существует.
Ответ в формате массива: при передаче дополнительного аргумента count, команда возвращает массив элементов или пустой массив, если key не существует.
Примеры
SADD myset one two three SRANDMEMBER myset SRANDMEMBER myset 2 SRANDMEMBER myset -5
Описание поведения при передаче аргумента count
Когда аргумент count имеет положительное значение, эта команда ведет себя следующим образом:
- Возвращаются только уникальные элементы.
- Если
countбольше мощности множества, команда вернёт только все элементы множества без дополнительных элементов. - Порядок элементов в ответе не является истинно случайным, поэтому клиент должен отсортировать их, если это необходимо.
Когда аргумент count имеет отрицательное значение, поведение меняется следующим образом:
- Возврат повторяющихся элементов возможен.
- Возвращается ровно
countэлементов или пустой массив, если множество пусто (ключ не существует). - Порядок элементов в ответе — истинно случайный.
Распределение возвращаемых элементов
Примечание: этот раздел актуален только для Redis 5 и ниже, так как Redis 6 реализует более справедливый алгоритм.
Распределение возвращаемых элементов далековато от идеального, когда количество элементов в множестве невелико. Это связано с тем, что мы использовали приближённую функцию выбора случайного элемента, которая не гарантирует хорошего распределения.
Используемый алгоритм, реализованный в dict.c, выбирает пустые корзины хеш-таблицы. После нахождения непустой корзины, поскольку в нашей реализации хеш-таблицы используется цепирование, проверяется количество элементов внутри корзины и выбирается случайный элемент.
Это означает, что если у вас две непустые корзины в всей хеш-таблице, и одна содержит три элемента, а другая только один, элемент, который единственный в своей корзине, будет возвращаться с гораздо большей вероятностью.
История
- Начиная с версии Redis 2.6.0: добавлен необязательный аргумент
count.
© 2006–2022 Salvatore Sanfilippo
Licensed under the Creative Commons Attribution-ShareAlike License 4.0.
https://redis.io/commands/srandmember/