Я создаю систему, которая помещает unique-id в конец очереди с соответствующим номером списка ожидания. Когда пользователь регистрируется в системе, ему дается номер списка ожидания , который связан с unique-id , который помещается в конец очереди.
Номер списка ожидания, связанный с уникальным идентификатором в очереди, уменьшается на 1, когда член очереди выталкивается из передней части очереди или когда член повышается в очереди. Члены очереди повышаются при выполнении определенной задачи (это может быть любая задача, вызывающая функцию повышения).
В системе должны быть следующие функции: -
- getWaitlist (строка идентификатора) : - Функция при вызове возвращает текущий номер списка ожидания члена очереди, используя идентификатор
- PromoMember (строка идентификатора) : - Функция при вызове выполняет две вещи: -
- Если член не находится в 0-м индексе очереди, тогда член меняет местами свою позицию в списке ожидания с членом, находящимся прямо перед ним.
- Если член находится в 0-м индексе очереди, член выталкивается из очереди и его список ожидания становится равным 0, а остальная часть списка ожидания члена уменьшается на 1 .
Решение, которое я мог придумать, - использовать Redis list для построения очереди. Но проблема, с которой я сталкиваюсь, - это получение элемента из очереди, так как использование LINDEX занимает время O (N), и индекс элемента должен быть известен заранее. Использование LRANGE занимает O (N) времени, чтобы получить все элементы.
В списках Redis нет возможности поменять местами элементы, это нужно было делать отдельно, извлекая весь список, меняя местами элементы и отправляя его обратно в Redis, что включает слишком много операций.
Есть ли лучший способ, архитектура или технологический стек, который я должен использовать для повышения производительности системы?