首页 > 解决方案 > 如何使用 Redis 构建可以交换队列元素的队列?

问题描述

我正在构建一个系统,该系统在队列末尾推送一个带有相关候补名单编号的唯一 ID 。当用户注册到系统时,他们会获得一个等待列表编号,该编号与在队列末尾推送的唯一 ID相关联。

当队列的成员从队列的前面弹出或队列中的成员被提升时,与队列中的唯一 ID关联的等待列表编号减 1。队列成员在执行某个任务时被提升(可以是任何调用提升函数的任务)

该系统应具有以下功能:-

  1. getWaitlist(id string) :- 该函数在调用时使用id返回队列成员的当前候补名单编号
  2. promoteMember(id string) :- 该函数在被调用时会做两件事:-
    1. 如果该成员不在队列的第 0 个索引处,则该成员将其等待列表位置与它前面的成员交换。
    2. 如果该成员位于队列的第 0个索引处,则将该成员从队列中弹出,其候补名单变为 0,该成员的候补名单的其余部分减 1。

我能想到的解决方案是使用Redis 列表来构建队列。但是我面临的问题是从队列中检索一个元素,因为使用LINDEX需要 O(N) 时间,并且应该事先知道元素的索引。使用LRANGE需要 O(N) 时间来获取所有元素。

Redis列表中没有办法交换元素位置,必须单独通过获取整个列表,交换元素并将其推送回Redis来完成,这涉及太多操作。

我应该使用更好的方法或架构或技术堆栈来提高系统性能吗?

标签: database-designredisarchitecturequeuesystem-design

解决方案


推荐阅读