LMOVE source destination LEFT|RIGHT LEFT|RIGHT

LMOVE 用于原子地从列表 source 中移除并返回第一个或最后一个元素(头或尾取决于 wherefrom 参数),然后把这个元素插入到列表destination 的第一个或最后一个元素(头或尾取决于 wherefrom 参数)。

例如: 假设 source 列表成员为 a,b,c,列表 destination 成员为 x,y,z

执行 LMOVE source destination RIGHT LEFT 的结果是列表 source 成员为a,b ,列表 destination 成员为c,x,y,z

如果列表 source 不存在,返回 nil ,什么也不执行。

如果列表 sourcedestination 相同,相当于从列表的一端删除元素,在放入列表的另一端,所以可以当做一个列表循环命令。(如果wherefromwhereto相同,相当于什么也没做。)

LMOVE 用来替换废弃的指令 RPOPLPUSH,相当于执行LMOVE RIGHT LEFT

*返回值

多行字符串: 被移除并再次插入的元素。

*例子

redis>  RPUSH mylist "one"
(integer) 1
redis>  RPUSH mylist "two"
(integer) 2
redis>  RPUSH mylist "three"
(integer) 3
redis>  LMOVE mylist myotherlist RIGHT LEFT
ERR Unknown or disabled command 'LMOVE'
redis>  LMOVE mylist myotherlist LEFT RIGHT
ERR Unknown or disabled command 'LMOVE'
redis>  LRANGE mylist 0 -1
1) "one"
2) "two"
3) "three"
redis>  LRANGE myotherlist 0 -1
(empty list or set)
redis> 

*Pattern: 可靠队列

Redis 经常被用来作为消息队列来处理后台作业。

简单形式的队列使用方式是生产者向队列插入值,消费者使用 RPOP 命令轮询或者 BRPOP 阻塞等待。

简单模式的队列是不可靠,因为消息可能会丢失,例如,发生网络问题或消费者刚拿到消息还没处理时崩溃。

LMOVE (或 BLMOVE ) 可以避免这些问题:消费者获取消息的同时把消息放入待处理队列,然后再使用 LREM 命令删除已经处理完成的消息。

可以有额外的客户端监控待处理队列,检查队列中哪些成员长时间未处理快要超时,如果需要的话再把这些成员重新插入到队列中。

*Pattern: 环境队列

客户端可以遍历列表成员,通过 LMOVE 参数有相同的 source 和 destination,时间复杂度是O(N) ,而不需要传输整个列表到客户端使用 LRANGE 操作。

即便如下两种情况也有效:

  • 多个客户端同时遍历列表:每个客户端会查到不同的元素,知道队尾,然后好重新开始遍历。
  • 其它客户端向队尾增加元素。

这使得构建一个N个workers同时处理队列中的元素的系统变得很容易且运行速度快。

一个例子是监控系统用来检查大量网站的可访问性,通过最小的延迟,并行使用多个工作进程。

这种worker进程的实现是容易扩展并可靠的,因为即使某次处理丢失一个消息,下次遍历还会再次处理该消息。