RPOPLPUSH
RPOPLPUSH source destination
可用版本: >= 1.2.0
时间复杂度: O(1)
RPOPLPUSH命令是一个原子命令,在一个原子时间内,会执行以下两个动作(都执行成功或者都执行失败):
- 将列表
source
中的表尾元素弹出,并返回给客户端。 - 将列表
source
弹出的表尾元素插入到列表destination
的表头位置。
演示
RPOPLPUSH命令会返回列表source
弹出的表尾元素。
127.0.0.1:6379> lpush list1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lrange list1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lpush list2 6 7 8 9 10
(integer) 5
127.0.0.1:6379> lrange list2 0 -1
1) "10"
2) "9"
3) "8"
4) "7"
5) "6"
127.0.0.1:6379> rpoplpush list2 list1
"6"
127.0.0.1:6379> lrange list1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> lrange list2 0 -1
1) "10"
2) "9"
3) "8"
4) "7"
如果source
不存在,值(nil)
会被返回,并且不执行其他动作。
127.0.0.1:6379> del list2
(integer) 1
127.0.0.1:6379> lrange list2 0 -1
(empty list or set)
127.0.0.1:6379> lrange list1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> rpoplpush list2 list1
(nil)
127.0.0.1:6379> lrange list1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
如果destination
不存在,RPOPLPUSH命令会先创建一个空的列表destination
,然后再执行该命令。
127.0.0.1:6379> lpush list2 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> lrange list2 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> del list1
(integer) 1
127.0.0.1:6379> rpoplpush list2 list1
"1"
127.0.0.1:6379> lrange list1 0 -1
1) "1"
127.0.0.1:6379> lrange list2 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
如果列表source
和列表destination
是同一个列表,这种特殊情况视作列表的旋转操作。
127.0.0.1:6379> lrange list1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> rpoplpush list1 list1
"1"
127.0.0.1:6379> lrange list1 0 -1
1) "1"
2) "6"
3) "5"
4) "4"
5) "3"
6) "2"
如果source
或destination
不是列表类型,RPOPLPUSH命令显然会报错。
127.0.0.1:6379> set str "this is string"
OK
127.0.0.1:6379> rpoplpush str list1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> rpoplpush list1 str
(error) WRONGTYPE Operation against a key holding the wrong kind of value
BLPOP
BLPOP key [key …] timeout
可用版本: >= 2.0.0
时间复杂度: O(1)
BLPOP命令是列表的阻塞式弹出原语,它是LPOP命令的阻塞版本。单个参数key
的情况下,当给定列表key
内没有任何元素可供弹出的时候,连接将被BLPOP命令阻塞,直到等待超时或发现可弹出的元素为止。多个参数key
的情况下,按参数key
的先后顺序依次检查各个列表,只弹出遇到的第一个非空列表的表头元素,如果给定的多个列表key
都是空列表或不存在,连接将被BLPOP命令阻塞,直到等待超时或发现其中某一个列表有可弹出的元素为止。
演示
非阻塞行为:给定的多个参数key
中至少有一个非空列表,那么只弹出遇到的第一个非空列表的表头元素,并和被弹出元素的列表的名称一起,组成结果返回给客户端。
127.0.0.1:6379> del list1
(integer) 1
127.0.0.1:6379> del list2
(integer) 1
127.0.0.1:6379> lpush list1 1 2 3
(integer) 3
127.0.0.1:6379> lpush list2 4 5 6
(integer) 3
127.0.0.1:6379> exists list3
(integer) 0
127.0.0.1:6379> blpop list3 list2 list1 0
1) "list2"
2) "6"
127.0.0.1:6379> lrange list2 0 -1
1) "5"
2) "4"
127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "2"
3) "1"
可见list1
是没有被弹出的。
阻塞行为:如果给定的多个参数key
都是空列表或不存在,那么BLPOP命令将会阻塞连接,直到等待超时,或有另一个客户端对给定的某个key
执行LPUSH命令或 RPUSH命令为止。超时参数timeout
接受一个以秒为单位的数字作为值。超时参数设为0
表示阻塞时间可以无限期延长。BLPOP命令返回时会有等待时间。
客户端一:
127.0.0.1:6379> del list1 list2
(integer) 2
127.0.0.1:6379> exists list1 list2 list3
(integer) 0
127.0.0.1:6379> blpop list1 list2 list2 0
1) "list1"
2) "this is list1"
(41.02s)
客户端二:
127.0.0.1:6379> lpush list1 "this is list1"
(integer) 1
超时情况,设置超时时间为15
秒。
127.0.0.1:6379> del list1 list2 list3
(integer) 0
127.0.0.1:6379> blpop list1 list2 list2 15
(nil)
(15.09s)
相同的参数key
可以被多个客户端同时阻塞。不同的客户端会被放进一个队列中,按先阻塞先服务的顺序为列表key
执行BLPOP命令。
客户端一:
127.0.0.1:6379> exists list1 list2 list3
(integer) 0
127.0.0.1:6379> blpop list1 list2 list3 0
1) "list2"
2) "this is list2"
(46.05s)
客户端二:
127.0.0.1:6379> blpop list1 list2 list3 0
1) "list3"
2) "this is list3"
(45.42s)
客户端三:
127.0.0.1:6379> lpush list2 "this is list2"
(integer) 1
127.0.0.1:6379> lpush list3 "this is list3"
(integer) 1
BRPOP
BRPOP key [key …] timeout
可用版本: >= 2.0.0
时间复杂度: O(1)
BRPOP命令是列表的阻塞式弹出原语,它是RPOP命令的阻塞版本,和BLPOP命令的使用方式类似,只是这两个命令弹出列表元素的位置不一样而已。
演示
这里就只演示一般情况,其他情况下的使用可以借鉴BLPOP命令中的演示。
127.0.0.1:6379> lpush list2 1 2 3
(integer) 3
127.0.0.1:6379> lrange list2 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> exists list1 list2 list3
(integer) 1
127.0.0.1:6379> brpop list1 list2 list3 0
1) "list2"
2) "1"
127.0.0.1:6379> lrange list2 0 -1
1) "3"
2) "2"
BRPOPLPUSH
BRPOPLPUSH source destination timeout
可用版本: >= 2.2.0
时间复杂度: O(1)
BRPOPLPUSH命令是RPOPLPUSH命令的阻塞版本,当给定列表source
不为空时,BRPOPLPUSH 命令执行的效果和RPOPLPUSH命令一样。而当列表source
为空时,BRPOPLPUSH命令将会阻塞连接,直到等待超时,或有另一个客户端对列表source
执行LPUSH命令或RPUSH命令为止。
演示
在超时时间内没有任何元素可以被弹出,则返回一个(nil)
和等待时长。
127.0.0.1:6379> exists list1
(integer) 0
127.0.0.1:6379> brpoplpush list1 list2 10
(nil)
(10.02s)
否则返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。
127.0.0.1:6379> exists list1
(integer) 0
127.0.0.1:6379> brpoplpush list1 list2 0
"0"
(14.97s)
127.0.0.1:6379> lpush list1 0 0 0
(integer) 3
其他情况下的使用可以借鉴RPOPLPUSH命令和BLPOP命令中的演示。
Redis中列表的RPOPLPUSH、BLPOP、BRPOP、BRPOPLPUSH命令就介绍到这里。
写博客是博主记录自己的学习过程,如果有错误,请指正,谢谢!