Redis实现的消息队列有哪些

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

1. 基于List的消息队列(最基础、最常用)

  • 核心原理:利用List双向链表的特性,通过「LPUSH/RPUSH」(入队)、「LPOP/BRPOP」(出队)实现FIFO队列,其中BRPOP可实现阻塞读取,避免无效轮询浪费资源。
  • 关键特点:支持Redis持久化(AOF/RDB),消息重启不丢失;实现简单、延迟低;但不支持ACK机制(消费失败易丢失)、无广播能力、无消息回溯。
  • 适用场景:轻量级异步任务,如日志收集、优惠券发放、订单异步处理等,容忍少量消息丢失。

# 基于List的消息队列核心命令
# 1. 入队(左侧入队,右侧入队用RPUSH)
LPUSH queue:list msg1 msg2
# 2. 出队(非阻塞出队用LPOP,阻塞出队用BRPOP,超时10秒)
LPOP queue:list
BRPOP queue:list 10
# 3. 查看队列所有消息
LRANGE queue:list 0 -1

2. 基于Pub/Sub(发布/订阅)的消息队列

  • 核心原理:基于「频道(Channel)」实现广播模式,生产者用PUBLISH发送消息到指定频道,消费者用SUBSCRIBE/PSUBSCRIBE订阅频道,实现一对多消息推送。
  • 关键特点:实时性强,支持多消费者同时接收同一条消息;但无消息持久化(消费者离线则消息丢失)、无ACK机制、无消息堆积处理能力。
  • 适用场景:实时通知、在线广播,如聊天室、WebSocket推送、系统实时告警等。

# 基于Pub/Sub的消息队列核心命令
# 1. 发布消息到指定频道
PUBLISH channel:test "hello redis pub/sub"
# 2. 订阅频道(单个频道/模糊匹配频道)
SUBSCRIBE channel:test
PSUBSCRIBE channel:*
# 3. 取消订阅频道
UNSUBSCRIBE channel:test
PUNSUBSCRIBE channel:*

3. 基于Stream的消息队列(Redis 5.0+ 推荐,专业级)

  • 核心原理:Redis官方推出的专用消息队列结构,基于Radix Tree实现有序消息日志,借鉴Kafka的消费者组机制,支持自定义消息ID、ACK确认、消息回溯。
  • 关键特点:支持持久化、消费者组负载均衡、ACK机制(未确认消息存入Pending List)、消息回溯;功能完善,接近专业MQ,但使用稍复杂,要求Redis版本≥5.0。
  • 适用场景:高可靠业务、分布式系统,如金融级消息、需要确保消息不丢失的异步任务、多消费者协同处理场景。

# 基于Stream的消息队列核心命令(Redis 5.0+)
# 1. 新增消息(*自动生成消息ID,可自定义ID)
XADD stream:test * name "test" content "stream msg"
# 2. 读取消息(从开头读取5条)
XREAD COUNT 5 STREAMS stream:test 0
# 3. 消费者组操作(创建组、消费者读取消息)
XGROUP CREATE stream:test group1 0
XREADGROUP GROUP group1 consumer1 COUNT 3 STREAMS stream:test >
# 4. ACK确认已消费消息
XACK stream:test group1 1690000000000-0

4. 基于Sorted Set的延迟消息队列

  • 核心原理:利用Sorted Set的分数(Score)排序特性,将任务执行时间戳作为Score,任务内容作为Member,消费者定期轮询获取Score≤当前时间戳的到期任务,实现延迟触发。
  • 关键特点:实现简单,适合轻量级延迟场景;可通过批量获取、分布式锁优化性能和避免重复消费;也可结合Stream实现高可靠延迟队列。
  • 适用场景:定时任务处理,如订单超时取消、定时通知、延迟重试等。

# 基于Sorted Set的延迟消息队列核心命令
# 1. 添加延迟消息(Score为到期时间戳,Member为任务内容)
ZADD delay:queue 1690000000 "order:1001:cancel"
# 2. 获取当前到期的10条消息
ZRANGEBYSCORE delay:queue 0 1690000000 LIMIT 0 10
# 3. 删除已处理的消息
ZREM delay:queue "order:1001:cancel"

四种Redis消息队列对比表

基于List

List(双向链表)

是(支持AOF/RDB)

LPUSH/RPUSH、LPOP/BRPOP、LRANGE

轻量级异步任务,如日志收集、优惠券发放、订单异步处理等,容忍少量消息丢失

基于Pub/Sub

Channel(频道)

是(一对多推送)

PUBLISH、SUBSCRIBE、PSUBSCRIBE

实时通知、在线广播,如聊天室、WebSocket推送、系统实时告警等

基于Stream

Stream(有序消息日志)

是(支持AOF/RDB)

否(支持消费者组负载均衡)

是(未确认消息存入Pending List)

XADD、XREAD、XGROUP、XACK

高可靠业务、分布式系统,如金融级消息、需要确保消息不丢失的异步任务、多消费者协同处理场景

基于Sorted Set

Sorted Set(有序集合)

是(支持AOF/RDB)

否(需自行实现确认逻辑)

ZADD、ZRANGEBYSCORE、ZREM

定时任务处理,如订单超时取消、定时通知、延迟重试等

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

Redis常用的数据结构 文章被收录于专栏

Redis 作为高性能键值数据库,核心在于丰富的数据结构。本专栏聚焦String、Hash、List、Set、ZSet、Bitmap、HyperLogLog 等常用类型,从底层原理、使用场景到实战示例,清晰讲解每种结构的优缺点与最佳实践。帮你快速掌握如何用对数据结构,提升缓存、限流、排行榜、消息队列等业务场景的开发效率,写出更稳定、高效的 Redis 应用。

全部评论

相关推荐

03-15 10:59
已编辑
美团_后端开发(实习员工)
爱写代码的菜code...:哎,自己当时拿到字节offer的时候也在感叹终于拿到了,自己当时最想去的企业就是字节,结果还是阴差阳错去了鹅厂。祝uu一切顺利!!!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务