Redis消息队列实现详解
2024年1月1日
消息队列
是什么
- 传递消息的队列,有先入先出的特性。
- 消息队列一般用于异步流程,消息分发,流量削峰
- 消息队列可以实现高性能、高可用、高拓展的架构
比较出名的消息队列
ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ
redis 做消息队列
上面出名的消息队列,比如 kafka 都是很优秀的消息队列中间件,但是接入和维护一个消息队列中间件,还是比较繁重的事务。
轻量级的消息队列能用 redis 实现
List 做消息队列
回顾 List
- 是一个双端列表,可以先入先出

使用 List 相关命令就可以实现一个消息队列
- RPUSH
- LPOP
缺点 1
消费者无法知道 LPOP 时机,只能不停按时间间隔轮询。
解决 1:阻塞版 POP
- BRPOP
- BLPOP
如果没有消息,就会阻塞,直到达到超时时间,设置为 10S

缺点 2:无 ACK 机制
消费者去消息后,消息就退出队列了,如果消费失败,消息还得想办法放回去,同时也不支持多人消费
Pub/Sub 生产订阅模式
当某个订阅者订阅了某个频道,如果生产者将消息发送到这个频道,订阅者就会收到该消息,支持多个消费者订阅相同的频道,无不干扰

用法
- 两个客户端订阅 chanmsg 这个 channel,语法:subscribe channel

- 在第三个终端,连续发送 3 条信息,语法:publish channel message

- 在订阅者终端,两个终端均显示如下

订阅者支持订阅模式,即一个模式消息,比如 chan*,就订阅所有 chan 开头的频道

缺点
- 不支持 ack
- 不支持持久化,redis 重启,信息会全部丢失,所以适合处理不那么重要的信息
stream 做消息队列
。不重要
几种方式对比
- List,不需要ACK,不需要消费组,可用
- PUB/SUB,不需要ACK,不需要持久化,可用
- Stream,需要ACK,需要消费组,需要持久化,可用 Stream功能最全,但是相对完备的消息队列中间件比如Kafka,可靠性还是很大差距,不支持至少一次语意,因为Redis本身的数据持久化都是有时间空隙的,如果对数据的可靠要求比较强,还是需要用完整的消息中间件。
Redis这三种,是三种不同功能要求下的消息传递手段,Stream相对来说在轻量级里相对完善。