消息队列概念
消息队列不仅可以用来传输消息,还可以确保消息的安全性(持久化、确保消息被消费)
Redis消息队列实现
基于List结构模拟消息队列
非阻塞式:利用LPUSH结合RPOP、或者RPUSH结合LPOP来实现;
阻塞式:利用BLPUSH和BRPOP实现
如果已经从队列中取到了消息,但是发生宕机等情况,这条消息就会丢失,并且pop的形式也只支持单消费者(智能有一个人拿到这个消息)
基于PubSub的消息队列
PubSub是Redis2.0版本引入的消息传递模型。消费者可以订阅一个或多个channel,生产者向对应channel发送消息后,所有订阅者都能收到相关信息。
发送的消息不会在redis中保存,如果没有人接收就会丢失。
基于Stream的消息队列
单消费模式
Stream是Redis 5.0引入的一种新数据类型,可以实现一个功能非常完善的消息队列。
发送消息命令:
读取消息的方式:
堵塞式读取方法:
当指定起始ID为¥(读取最新消息)时,如果同时来了好几条消息,会出现消息漏读的情况。
消费者组
创建消费者组:
从消费者组读取消息:
确认消息:XACK [消费者][组][消息序号]