Как извлечь N случайных неповторяющихся элементов из SET в Redis?

Есть SET c 1000 id, надо выбрать 3 случайных и неповторяющихся.


Решение «в лоб» — 3 раза сделать SRANDMEMBER, но нет гарантии, что не будет повторов.

Можно — контролировать повторы на уровне клиента и крутить цикл SRANDMEMBER до тех пор, пока полученный набор не будет уникальным, но это тоже несколько коряво.


Сортировать по случайной величине (что-то в духе SORT… BY RAND LIMIT 3 INTO… ) Redis не умеет.


В результате SORT… INTO… результирующий список будет типа LIST и сделать несколько раз SPOP оттуда нельзя.


Вдруг кто-то знает элегантный способ?
  • Вопрос задан
  • 2920 просмотров
Пригласить эксперта
Ответы на вопрос 2
Shedar
@Shedar
Элегантный и быстроработающий, но не самый простой — сделать ветку redis на github, реализовать SRANDMEMBERS, который будет в качестве параметра получать количество возвращаемых результатов, после чего использовать и предложить включить в основную ветку.
Сейчас функция dictGetRandomKey используется в следующих случаях: при экспайре, при получении случайного ключа из базы, при проверке можно ли свопить элемент и при получении случайного элемента множества.
Или же в лоб. SPOP при большой нагрузке — нужно настраивать чтобы redis не начал постоянно пересохранять данные на винт из-за постоянно изменяющихся данных, и ИМХО дополнительный риск их потери.
Ответ написан
@avarjo
3 раза SPOP потом 3 раза добавить
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы