Redis:列表RPOPLPUSH、BLPOP、BRPOP、BRPOPLPUSH命令介绍

RPOPLPUSH

RPOPLPUSH source destination
可用版本: >= 1.2.0
时间复杂度: O(1)

RPOPLPUSH命令是一个原子命令,在一个原子时间内,会执行以下两个动作(都执行成功或者都执行失败):

  1. 将列表source中的表尾元素弹出,并返回给客户端。
  2. 将列表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"

如果sourcedestination不是列表类型,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命令就介绍到这里。

写博客是博主记录自己的学习过程,如果有错误,请指正,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITKaven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值