Простая очередь задач на основе redis ZSET с защитой от переполнения

--

Часто использую redis в своих проектах для хранения оперативных данных. И тут возникла необходимость в одном из них реализовать очередь. Producer был в одном приложении, а consumer в другом, часть задачи выполнялась на удаленном сервере. При этом важна последовательность выполнения.

Раньше я не использовал ZSET, потому что не знал что с ним делать. Не понятно было что брать в качестве весов и не было удобных методов извлечения данных для решения моих задач (тогда я еще использовал версию redis-server 2.8.x). И тут (в 2018 году) выходит redis 5.0 и приносит pop-методы (ZPOPMAX, ZPOPMIN и их блокирующие аналоги).

Теперь есть возможность извлекать из упорядоченного сета первый или последний элемент.

Осталось защитить очередь от переполнения в случае каких то проблем с исполнителем. С этим поможет метод ZREMRANGEBYSCORE. Но каким образом? Все просто. Главное правильно определиться с тем, что мы будем записывать в качестве весов (score) в ZSET.

В моем случае было важно, чтобы задачи в очереди не копились более 7 дней. Очередь обрабатывалась на удаленном сервере, и задача удалялась из неë только в случае, если она была успешно обработана.

Если в качестве веса использовать отрицательное значение штампа времени текущей даты, то ранее добавленные элементы будут ближе к нулю, чем новые. Таким образом их можно легко отбросить, вызывая ZREMRANGEBYSCORE с отрицательным значением timestamp нужной даты и 0.

С примером на python можно ознакомиться по ссылке.

--

--

Andrey Terekhin
0 Followers

I am a python developer. I am interested in IP telephony, image processing and development of telegram bots.