在Redis的数据结构中,list这个类型的数据结构,我们说底层是采用的双向链表结构,可以从左边出队入队,也可以从右边出队入队,那其实list也提供了阻塞出队的命令,类似于jdk中的阻塞队列
blpop
127.0.0.1:6379> lpush test-list a b c d
(integer) 5
127.0.0.1:6379> lrange test-list 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "a"
此时开启一个新的客户端连接,执行
127.0.0.1:6379> blpop test-list 5
1) "test-list"
2) "d"
127.0.0.1:6379> blpop test-list 5
1) "test-list"
2) "c"
127.0.0.1:6379> blpop test-list 5
1) "test-list"
2) "b"
127.0.0.1:6379> blpop test-list 5
1) "test-list"
2) "a"
127.0.0.1:6379> blpop test-list 5
1) "test-list"
2) "a"
127.0.0.1:6379> blpop test-list 5
(nil)
(5.04s)
可以看到,在该命令中,需要指定一个超时时间的概念,这个超时时间的意思就是,如果在5S之内,没有从list中获取到出队的元素,就会返回nil,如果指定为0,就表示一直阻塞
所以,如果当前list为空,执行了blpop命令,就会一直阻塞,直到list中有元素入队
127.0.0.1:6379> blpop test-list 30
1) "test-list"
2) "cc"
(3.16s)
执行了这个命令之后,不会立即打印cc,因为此时test-list为空,我在另外一个客户端执行
127.0.0.1:6379> lpush test-list cc
(integer) 1
第一个客户端,会立即打印cc,并且展示阻塞的时间是3.16S
同理,brpop就是默认从右边出队,并且是阻塞的
这个类似于jdk提供的阻塞队列,只是使用redis去实现的话,是分布式的,具体的应用场景,还没有想到,看到了这个命令,所以记录一下如何使用