1.1 Redis发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。支持频道channel和模式pattern两种模式。
缺点:发布订阅模式是无法持久化的,如果出现网络断开、Redis 宕机等,消息就会被丢弃;
优点:支持多组生产者、消费者处理消息
1.2 Redis 基于List做队列
生产者使用 LPUSH 发布消息,消费者使用 BRPOP 拉取消息。
缺点:
1、不支持重复消费:消费者拉取消息后,这条消息就从List 中删除了,无法被其它消费者再次消费,即不支持多个消费者消费同一批数据
2、消息丢失:消费者拉取到消息后,如果发生异常宕机,那这条消息就丢失了
优点:简单易用,支持持久化
1.3 Redis 基于Stream做队列
基于消息链表实现,将所有加入的消息都串起来,每个消息都有一个唯一的 ID 和对应的内容
Consumer Group:消费者组,一个消费组有多个消费者
last_delivered_id:游标,任意一个消费者读取了消息都会使游标往前移动
pending_ids:消费者(Consumer)的状态变量,作用是维护消费者的未确认的 id。 pending_ids 记录了当前已经被客户端读取的消息,但是还没有 ack
优点:
支持阻塞式拉消息
支持发布 / 订阅模式
支持多播、ACK、消息转移
缺点:len限制、也有可能丢消息(aof、主从切换)
1.4 Redis 消息队列总结
List | Pub/Sub | Stream | |
阻塞式消费 | 支持 | 支持 | 支持 |
发布/订阅 | 不支持 | 支持 | 支持 |
重复消费 | 不支持 | 不支持 | 支持 |
持久化 | 支持 | 不支持 | 支持 |
消息堆积 | 内存持续增长 | 缓冲区溢出,消费者强制下线 | 可控制队列最大长度 |
消息是否会丢 | Redis本身不保证数据完整性,有可能存在数据丢失 | ||
消息积压能力 | Redis数据存储在内存,消息堆积对内存压力较大 |