【发布时间】:2018-08-12 23:07:54
【问题描述】:
我已经在 Redis 中设置了一个先进先出 (FIFO) 队列,其中包含使用 RPUSH/LPUSH 和 RPOP/LPOP 的 LIST,如何以原子方式一次从队列中弹出多个项目?如果 LISTs 和提到的命令不支持它,我应该改用什么?
【问题讨论】:
我已经在 Redis 中设置了一个先进先出 (FIFO) 队列,其中包含使用 RPUSH/LPUSH 和 RPOP/LPOP 的 LIST,如何以原子方式一次从队列中弹出多个项目?如果 LISTs 和提到的命令不支持它,我应该改用什么?
【问题讨论】:
没有执行多个弹出的命令,但您可以将它们包装在 transaction 或 Lua script 中。
【讨论】:
Redis transactions 保证是原子的,因此可用于首先使用 LRANGE 获取项目,然后使用 LTRIM 删除它们:
> RPUSH l 1 2 3 4 5
LRANGE mylist 0 -1
> MULTI
OK
> LRANGE l 0 1
QUEUED
> LTRIM l 2 -1
QUEUED
> EXEC
1) 1) "1"
2) "2"
2) OK
> LRANGE l 0 -1
1) "3"
2) "4"
3) "5"
【讨论】: