database-design - 如何使用 Redis 构建可以交换队列元素的队列?
问题描述
我正在构建一个系统,该系统在队列末尾推送一个带有相关候补名单编号的唯一 ID 。当用户注册到系统时,他们会获得一个等待列表编号,该编号与在队列末尾推送的唯一 ID相关联。
当队列的成员从队列的前面弹出或队列中的成员被提升时,与队列中的唯一 ID关联的等待列表编号减 1。队列成员在执行某个任务时被提升(可以是任何调用提升函数的任务)
该系统应具有以下功能:-
- getWaitlist(id string) :- 该函数在调用时使用id返回队列成员的当前候补名单编号
- promoteMember(id string) :- 该函数在被调用时会做两件事:-
- 如果该成员不在队列的第 0 个索引处,则该成员将其等待列表位置与它前面的成员交换。
- 如果该成员位于队列的第 0个索引处,则将该成员从队列中弹出,其候补名单变为 0,该成员的候补名单的其余部分减 1。
我能想到的解决方案是使用Redis 列表来构建队列。但是我面临的问题是从队列中检索一个元素,因为使用LINDEX需要 O(N) 时间,并且应该事先知道元素的索引。使用LRANGE需要 O(N) 时间来获取所有元素。
Redis列表中没有办法交换元素位置,必须单独通过获取整个列表,交换元素并将其推送回Redis来完成,这涉及太多操作。
我应该使用更好的方法或架构或技术堆栈来提高系统性能吗?
解决方案
推荐阅读
- google-apps-script - 使用谷歌应用脚本自动将脚本添加到谷歌文档
- flutter - 滚动后如何防止 ListView.builder 中的项目重新渲染?
- php - Woocommerce 购物车中的全局属性
- flask - ModuleNotFound:没有名为“SpeechRecognition”的模块
- wordpress - $uri/ 的 Nginx 原因
- python - 如何在python中处理特定功能的并发请求?
- docker - 如何调试 nvidia-docker build 中缺少的路径
- javascript - 我不理解 javascript 中的 if else 语句。谁能解释一下?
- java - 我想通过在 RecyclerView 中单击来将图像从一个活动转移到另一个活动
- c - 在 C 编程中,如何在 while 循环中清除屏幕?