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 应用。
