# RPOPLPUSH (已弃用)
移除列表的最后一个元素,并将该元素添加到另一个列表并返回。
从 Redis 版本 6.2.0 开始,此命令被视为已弃用。
在迁移或编写新代码时,可以用带有RIGHT和LEFT参数的LMOVE来替换它。
语法
RPOPLPUSH source destination
可用版本:
1.2.0
时间复杂度:
O(1)
ACL 类别:
@write
,@list
,@slow
以原子方式返回并删除存储在source
的列表的最后一个元素(尾),并将该元素推送到存储在的destination
列表的第一个元素(头)。
例如:考虑source
持有列表a,b,c
,destination
持有列表x,y,z
。执行RPOPLPUSH
结果为source
holdinga,b
和destination
holding c,x,y,z
。
如果source
不存在,则返回该值nil
,不进行任何操作。如果source
和destination
相同,则该操作相当于从列表中删除最后一个元素并将其作为列表的第一个元素推送,因此可以认为是列表旋转命令。
# 返回
批量字符串回复:被弹出和推送的元素。
# 例子
redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
redis> RPOPLPUSH mylist myotherlist
"three"
redis> LRANGE mylist 0 -1
1) "one"
2) "two"
redis> LRANGE myotherlist 0 -1
1) "three"
redis>
# 模式:可靠队列
Redis 通常用作消息传递服务器,以实现处理后台作业或其他类型的消息传递任务。RPOP
一种简单的队列形式通常是在生产者端将值推送到列表中,并在消费者端使用(使用轮询)等待这个值,或者BRPOP
如果客户端通过阻塞操作更好地服务。
但是,在这种情况下,获得的队列是不可靠的,因为消息可能会丢失,例如在网络问题的情况下,或者如果消费者在收到消息之后但在处理之前崩溃。
RPOPLPUSH
(或BRPOPLPUSH
对于阻塞变体)提供了一种避免此问题的方法:消费者获取消息并同时将其推送到处理列表中。处理完消息后,它将使用该LREM
命令从 处理列表中删除该消息。
额外的客户端可能会监视处理列表中停留时间过长的项目,如果需要,将超时的项目再次推送到队列中。
# 模式:循环列表
使用RPOPLPUSH
相同的源和目标键,客户端可以在 O(N) 中一个接一个地访问 N 元素列表的所有元素,而无需使用单个LRANGE
操作将完整列表从服务器传输到客户端。
即使出现以下一种或两种情况,上述模式仍然有效:
- 有多个客户端轮换列表:它们将获取不同的元素,直到列表的所有元素都被访问,并且进程重新启动。
- 其他客户正在积极推动列表末尾的新项目。
以上使得实现一个系统变得非常简单,其中一组项目必须由 N 个工作人员以尽可能快的速度连续处理。一个例子是一个监控系统,它必须检查一组网站是否可以访问,并且使用多个并行工作程序以尽可能小的延迟。
请注意,worker 的这种实现具有微不足道的可扩展性和可靠性,因为即使消息丢失,该项目仍在队列中,并将在下一次迭代中处理。
# 反馈
如果您在此页面上发现问题,或有改进建议,请提交请求以合并或打开存储库中的问题。