0%

redis学习笔记之-(5)-list(栈-队列-阻塞队列)

redis学习笔记之-(5)-list(栈-队列-阻塞队列)

list有关的命令: lpush/rpush/lpop/rpop/brpop/blpop

5.1 栈(stack)=lpush+lpop(出入同一端)

lpush+lpop

127.0.0.1:6379> lpush juc synchronized volatile aqs thread
(integer) 4
127.0.0.1:6379> lpop juc # 最后进入的最先出列
"thread"
127.0.0.1:6379> lpop juc # 倒数第二个
"aqs"
127.0.0.1:6379> lpop juc # 倒数第三个
"volatile"
127.0.0.1:6379> 

5.2 队列(queue)=lpush+rpop(出入两端)

lpush+rpop

127.0.0.1:6379> del juc 
(integer) 1
127.0.0.1:6379> lpush juc synchronized volatile aqs thread
(integer) 4
127.0.0.1:6379> rpop juc # 先进先出
"synchronized"
127.0.0.1:6379> rpop juc # 先进先出
"volatile"
127.0.0.1:6379> rpop juc # 先进先出
"aqs"
127.0.0.1:6379> 

5.3 阻塞队列=lpush+brpop(pop阻塞)

lpush+brpop

brpop语法:

brpop key [key...] timout

timeout = 0 表示如果没有数据插入就一直阻塞;

timeout = 5 表示阻塞 5秒 如果时间到还没有值就返回null;

示例:

127.0.0.1:6379> del juc
(integer) 0
127.0.0.1:6379> lpush juc synchronized volatile aqs thread # key=juc 入队4个词
(integer) 4
127.0.0.1:6379> brpop juc 5 # 从 juc中pop一个, 如果没有元素,候时5s
1) "juc"
2) "synchronized"
127.0.0.1:6379> brpop juc 5
1) "juc"
2) "volatile"
127.0.0.1:6379> brpop juc 5
1) "juc"
2) "aqs"
127.0.0.1:6379> brpop juc 5
1) "juc"
2) "thread"
127.0.0.1:6379> brpop juc 5  # 从 juc中pop一个, 如果没有元素,候时5s后没有新push进去的, 返回null
(nil)
(5.07s)

# 此时, 另开一个终端 redis-cli, 执行了: `lpush juc semaphore`
127.0.0.1:6379> brpop juc 0  # 从 juc中pop一个, 如果没有元素, 阻塞一直等待
1) "juc"
2) "semaphore"
(15.96s)
127.0.0.1:6379>