消息队列(Message Queue),字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色:
消息队列:存储消息。
生产者:发送消息到消息队列,在秒杀任务中负责判断秒杀时间和库存,校验消费者权限是否是一人一单,发送优惠券id和用户id到消息队列中。
消费者:从消息队列获取消息并处理消息,接受到订单消息之后,完成下单。
Redis提供了三种不同的方式来实现消息队列:
list结构:基于List结构模拟消息队列。
PubSub:基本的点对点消息模型。
Stream:比较完善的消息队列模型。
基于List结构模拟消息队列
消息队列(Message Queue),字面意思就是存放消息的队列。而Redis的list数据结构是一个双向链表,很容易模拟出队列效果。
队列是入口和出口不在一边,因此我们可以利用:LPUSH 结合 RPOP、或者 RPUSH 结合 LPOP来实现。
不过要注意的是,当队列中没有消息时RPOP或LPOP操作会返回null,并不像JVM的阻塞队列那样会阻塞并等待消息。因此这里应该使用BRPOP或者BLOPO来实现阻塞效果。