RPOPLPUSH (已弃用)
从 Redis 6.2.0 版本开始,此命令被视为已弃用。
在迁移或编写新代码时,可以使用带 RIGHT
和 LEFT
参数的 LMOVE
命令替代它。
RPOPLPUSH source destination
- 可用版本
- Redis 开源版 1.2.0
- 时间复杂度
- O(1)
- ACL 类别
-
@write
,@list
,@slow
,
原子地返回并移除存储在 source
的列表的最后一个元素(尾部),并将该元素推送到存储在 destination
的列表的第一个位置(头部)。
例如:假设 source
存储了列表 a,b,c
,destination
存储了列表 x,y,z
。执行 RPOPLPUSH
后,source
将存储 a,b
,而 destination
将存储 c,x,y,z
。
如果 source
不存在,则返回 nil
并且不执行任何操作。如果 source
和 destination
相同,则此操作相当于从列表中移除最后一个元素并将其作为列表的第一个元素推送,因此可以将其视为一个列表旋转命令。
示例
模式:可靠队列
Redis 常被用作消息服务器来实现后台任务处理或其他类型的消息任务。一种简单的队列形式通常是通过生产者端将值推送到列表中,然后在消费者端使用 RPOP
(通过轮询)或在客户端更适合阻塞操作时使用 BRPOP
来等待这些值。
然而在这种情况下,获得的队列并非可靠,因为消息可能会丢失,例如当发生网络问题或消费者在收到消息后但在处理消息前崩溃时。
RPOPLPUSH
(或阻塞版本的 BRPOPLPUSH
)提供了一种避免此问题的方法:消费者获取消息,同时将其推送到一个正在处理的列表中。一旦消息处理完毕,它将使用 LREM
命令将消息从正在处理的列表中移除。
另一个客户端可以监视正在处理列表,查找长时间停留在那里的项目,并在需要时将超时项目再次推回队列。
模式:循环列表
使用相同源键和目标键的 RPOPLPUSH
命令,客户端可以以 O(N) 的时间复杂度依次访问 N 个元素的列表中的所有元素,而无需使用单个 LRANGE
操作将整个列表从服务器传输到客户端。
即使发生以下一个或两个条件,上述模式也有效
- 有多个客户端在旋转列表:它们将获取不同的元素,直到列表中的所有元素都被访问,然后过程重新开始。
- 其他客户端正在积极地向列表末尾推送新项目。
上述方法使得实现一个系统变得非常简单,在该系统中,必须由 N 个工作进程持续尽可能快地处理一组项目。例如,一个监控系统必须使用多个并行工作进程检查一组网站是否可访问,并尽可能减小延迟。
请注意,这种工作进程的实现非常容易扩展且可靠,因为即使消息丢失,该项目仍在队列中,并在下一次迭代中得到处理。
RESP2 回复
以下之一
RESP3 回复
以下之一