Я пытаюсь реализовать систему очередей, используя redis.Допустим, у нас есть этот список:
> LPUSH listTickets 1 2 3 4 5 6 7 8 9
и как пользователь мобильного приложения кому-то был присвоен номер 4, а другому пользователю номер 6. Теперь я хочу показать им, сколько билетов перед ними (также рассчитать ожидаемое время ожидания).Теперь это может показаться простым,
> LPOP listTicket
"4"
, затем мы транслируем результат (текущий номер билета, который должен быть вызван), затем в мобильном приложении каждый вычтет его из своего номера билета.Например, мой текущий билет 6
, поэтому 6-4=2
Таким образом, каждый пользователь знает, сколько билетов впереди
Однако, как только вы захотите добавить функцию, позволяющую пользователю удалить свой билет или выдвинуть его в конецочередь, все усложняется.После удаления, например,
> LRANGE listTicket 0 -1
1) "2"
2) "4"
3) "6"
4) "7"
5) "8"
, когда мы LPOP listTicket
получим номер 2, а мобильное приложение с билетом 6 получит 6-2 и получит 4, что является неправильным расчетом.
Есть ли у вас какие-либо алгоритмы?Является ли получение индекса каждого тикета в списке каждый раз, когда кто-то удаляет тикет, дорогостоящим процессом для расчета?Должен ли я просто отправить все билеты в очереди и позволить пользователям рассчитать свою собственную позицию?
Я хочу, чтобы система могла масштабироваться.Так может ли сервер redis-node обрабатывать в общей сложности 50 тысяч (по разным очередям или спискам) подключенных мобильных приложений, получая свой рейтинг в очереди, на которую они подписали свой билет.
Я думал об использовании ZRANK
, но какэто загрузить сервер?