RPOPLPUSH source destination
自1.2.0版本可用 时间复杂度:O(1)
原子的移除并返回source的最后一个元素(尾), 并把返回的元素压入desination的第一个元素(头)。 例如:考虑source持有一个列表a,b,c 并且destination持有列表x, y, z。执行RPOPLPUSH造成source持有列表a,b而destination持有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通常都被用做一个处理各种后台工作或消息任务的消息服务器。一个简单的队列模式就是:生产都把消息放入一个列表中,等待消息的消费都用DROP命令(用轮询方式),或都用BRPOP命令(如果客户端使用阻塞操作会更好)来得到这个消息。 然而,因为消息有可能会丢失,所以这种队列并不是安全的。例如,当接收到消息后,出现了网络问题或者消费都端崩溃了,那么这个消息就丢失了。 RPOPLPUSH(或者其阻塞版本的BRPOPLPUSH)提供了一种方法来避免这个问题:消费者端取到消息的同时把该消息放入一个正在处理中的列表。当消息被处理之后,该命令会使用LREM命令来移除正在处理中列表中的对应消息。 另外,可以添加一个客户端来监控这个正在处理中列表,如果有霜些消息已经在这个列表存在很长时间了(即超过一定的处理时限),那么这个客户端会把这些超时消息重新加入到队列中。
模式:循环列表
RPOPLPUSH命令的source和destination是相同的话,那么客户端在访问一个拥有n个元素的列表时,可以在O(N)时间里一个接一个获取列表元素,而不用像LRAGE好样需要把整个列表从服务器端传送到客户端。 上面这种模式即使在以下两种情况下照样能很好地工作:
- 有多个客户端同时对同一个列表进行旋转(rotating):它们会取得不同的元素,直到列表里所有元素都被访问过,又从头开始这个操作。
- 有其他客户端在往列表末端加入新的元素。
这个模式让我们可以很容易地实现这样一个系统:有N个客户端,需要连续不断地对一批元素进行处理,而且处理的过程必须尽可能地快。一个典型的例子就是服务器上的监控程序:它们需要在尽可能短的时间内,并行地检查一批网站,确保它们的可访问性。
值得注意的是,使用这个模式的客户端是易于扩展(scalable)且安全(reliable),因为即使客户端把接收到的消息丢失了,这个消息依然存在于队列中,等下次迭代到它的时候,由其他客户端进行处理