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
,什么也不执行。
如果列表 source
和destination
相同,相当于从列表的一端删除元素,在放入列表的另一端,所以可以当做一个列表循环命令。(如果wherefrom
和 whereto
相同,相当于什么也没做。)
LMOVE
用来替换废弃的指令 RPOPLPUSH,相当于执行LMOVE RIGHT LEFT
。
*返回值
多行字符串: 被移除并再次插入的元素。
*例子
(integer) 1redis> RPUSH mylist "two"
(integer) 2redis> RPUSH mylist "three"
(integer) 3redis> 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)
*Pattern: 可靠队列
Redis 经常被用来作为消息队列来处理后台作业。
简单形式的队列使用方式是生产者向队列插入值,消费者使用 RPOP 命令轮询或者 BRPOP 阻塞等待。
简单模式的队列是不可靠,因为消息可能会丢失,例如,发生网络问题或消费者刚拿到消息还没处理时崩溃。
LMOVE (或 BLMOVE ) 可以避免这些问题:消费者获取消息的同时把消息放入待处理队列,然后再使用 LREM 命令删除已经处理完成的消息。
可以有额外的客户端监控待处理队列,检查队列中哪些成员长时间未处理快要超时,如果需要的话再把这些成员重新插入到队列中。
*Pattern: 环境队列
客户端可以遍历列表成员,通过 LMOVE 参数有相同的 source 和 destination,时间复杂度是O(N) ,而不需要传输整个列表到客户端使用 LRANGE 操作。
即便如下两种情况也有效:
- 多个客户端同时遍历列表:每个客户端会查到不同的元素,知道队尾,然后好重新开始遍历。
- 其它客户端向队尾增加元素。
这使得构建一个N个workers同时处理队列中的元素的系统变得很容易且运行速度快。
一个例子是监控系统用来检查大量网站的可访问性,通过最小的延迟,并行使用多个工作进程。
这种worker进程的实现是容易扩展并可靠的,因为即使某次处理丢失一个消息,下次遍历还会再次处理该消息。