Существует ли структура данных Redis, которая позволила бы атомизировать работу с popping (get + remove) несколькими элементами, которые она содержит?
Известны SPOP или RPOP, но они всегда возвращают одно значение. Поэтому, когда мне нужны первые N значений из набора/списка, мне нужно вызвать команду N-times, что дорого. Скажем, список set/содержит миллионы элементов. Есть ли что-то вроде SPOPM "setName" 1000
, которое вернет и удалит 1000 случайных элементов из набора или RPOPM "listName" 1000
, что вернет 1000 самых правых элементов из списка?
Я знаю, что есть команды типа SRANDMEMBER и LRANGE, но они не удаляют элементы из структуры данных. Их можно удалить отдельно. Однако, если клиенты читают больше из одной и той же структуры данных, некоторые элементы могут быть прочитаны более одного раза, а некоторые могут быть удалены без чтения! Поэтому атомизм - это то, о чем мой вопрос.
Кроме того, я в порядке, если сложность времени для такой операции дороже. Я сомневаюсь, что это будет дороже, чем выпуск N (скажем 1000, N из предыдущего примера) отдельных запросов на сервер Redis.
Я также знаю об отдельной поддержке транзакций. Однако это предложение от Redis docs не позволяет мне использовать его для параллельных процессов, изменяющих набор (деструктивное чтение из него):
При использовании WATCH EXEC будет выполнять команды только в том случае, если просмотренные ключи не были изменены, что позволяет использовать механизм проверки и настройки.