夜间模式
List模拟消息队列
list是redis的一个基本类型,组成是一个双向队列
模拟队列
双向队列模拟一个队列只需要保证先进先出即可
即Lpush
与Rpop
或RPOP
与RPUSH
配合使用即可
shell
127.0.0.1:6379> LPUSH queue 10 20 30
(integer) 3
127.0.0.1:6379> Rpop queue
"10"
127.0.0.1:6379> Rpop queue
"20"
1
2
3
4
5
6
2
3
4
5
6
模拟阻塞队列
单纯使用以上方法不能实现阻塞,redis有特定的方法可以添加等待时间,等待阻塞时间过期前是否能有元素取出
即BRPOP
和BLPOP
进程1设置等待时间并取出list的bq
sh
127.0.0.1:6379> BLPOP bq 20
1
进程2存储
sh
127.0.0.1:6379> Rpush bq 369
(integer) 1
1
2
2
此时进程1:
sh
127.0.0.1:6379> BLPOP bq 20
1) "bq"
2) "369"
(10.06s)
1
2
3
4
2
3
4
发现等待了十秒有消息进来了
如果没有消息会返回nil
sh
127.0.0.1:6379> blpop bq 1
(nil)
(1.06s)
1
2
3
2
3
优缺点
优点
- 利用redis存储,不受限JVM内存上限
- Redis有持久化机制,安全性保障
- 满足消息有序性
缺点:
消息丢失的可能性
取出消息后线程出错没有处理信息,导致消息丢失
只支持单消费者,某个消费者取出后从队列中消失,其他消费者使用找不到消息