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一切顺利!!!
点赞 评论 收藏
分享
03-11 20:19
已编辑
门头沟学院 Java
太压力了,面了2个多小时,本菜比已经被拷打的瑟瑟发抖面完两个小时后通知过了1.算法题三道(1)leetcode124 二叉树中最大路径和hard题 因为不久前才刷过撕出来了,又来了一道(2)leetcode 300 最长递增子序列变种除了递增之外还加了一个权重因素,但是思路没变,dp就行(3)寻找词汇库里符合固定长度前缀的匹配单词应该是他们自己题库的题。给了一串单词列表,然后又给了一个单词,一个下标,根据这个下标的前缀去单词列表里面找到所有匹配的单词再返回思路是创建一个单词前缀树,然后根据树找,但是可能是构件树数有问题没撕出来2.全方位项目拷打基本没有问八股,全部都是项目企业场景题,哎哟我操,完全不会。我就纯八股战士,结果没想到一道八股都没问反正尽可能把企业场景往八股上引吧。。1. 微服务多点部署其中一个宕机了怎么办2. 要是mq占据大量CPU该怎么排查?MySQL占据大量CPU该怎么排查?3. 假如说让你实现视频点赞功能,你打算怎么设计?讲讲思路(我知道多级缓存,但是碰巧没背……寄)4. Redis延迟双删是什么,分布式锁,哨兵模式5. MySQL到es同步的延迟该怎么优化6. Rabbit mq的队列是怎么实现的?(这个完全没整明白,可能是队列的底层结构? 反正我硬扯的讲了一下rabbit mq的架构)还扯了很多,但是往后完全就慌了),记住的是这些
不知道怎么取名字_:2小时确实有压力,持续性的脑力劳动啊
查看9道真题和解析
点赞 评论 收藏
分享
一面 情况:通过面经:百度后台开发实习一面 - 大概40min1. 自我介绍2. 大二实习的话时间能兼顾吗3. 常见数据结构了解过吗 说一下栈和队列的区别4. 用Golang手撕一个二分查找在数组中找到目标值(第一次手撕遇到这个内心暗暗自喜觉得面试官不为难我太好了)5. Go语言学了多久6. HTTP和HTTPS的区别7. 你说你项目里面用到了gRPC 说一下RPC和HTTP的区别8. 从浏览器输入一个网址到渲染页面出来的全过程背后是怎么样的9. 接口请求是怎么打到一个后端服务的(我重点答了打到服务器之后会根据端口去区分)10. MySQL的索引是什么11. 实际开发过程中用过什么索引 讲一下12. 项目中是怎么用Redis的 用了哪些数据类型 说一下13. MySQL聚簇索引和非聚簇索引的区别14. 进程 线程 协程有什么区别15. 你对项目部署了解多少 Docker这些有用过吗16. 平时开发用的是windows系统还是linux17. 熟悉linux基本命令吗 比如查看一个文件的最后几行内容用什么命令知道吗18. 写完二分查找之后又问了我一个微信红包的场景题 怎么保证微信红包的金额尽可能随机然后每个人抢到的概率随机 怎么去设计(这个场景题我没怎么接触过 答的不是很好)19. 常见设计模式了解过吗二面情况:通过面经:百度后台开发实习二面 - 大概35min1. 自我介绍2. 你项目中用到的SingleFlight合并请求解决缓存穿透是怎么用的 说一下3. 有没有看过SingleFlight的底层实现原理?说一下4. 如果让你用Go来实现这个 你会怎么做 说一下思路5. 你提到了channel 你知道channel的底层实现原理吗 有缓冲的channel和无缓冲的channel有什么区别?6. 项目中有没有遇到什么难点?7. 说一下你的MySQL和ES的一致性是怎么做的?8. 你说到用到了Kafka去消费消息 那你怎么保证最终同步过去后MySQL和ES同步成功(我一直在答Kafka消费失败的重试机制 死信队列那些 然后面试官说他想问的是怎么确定MySQL和ES同步成功了 我说可以考虑设计一个后台脚本来定期读取MySQL和ES 然后判断是否一致)9. 手撕题目:给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。示例 1:输入:s = "1 + 1"输出:2示例 2:输入:s = " 2-1 + 2 "输出:3示例 3:输入:s = "(1+(4+5+2)-3)+(6+8)"输出:23提示:1 <= s.length <= 3 * 105s 由数字、'+'、'-'、'('、')'、和 ' ' 组成s 表示一个有效的表达式'+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)'-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)输入中不存在两个连续的操作符每个数字和运行的计算将适合于一个有符号的 32位 整数后来才知道原来这个是Hot150题库上的一道 Hard 224. 基本计算器 之前没刷过 还是自己准备不足(我一开始一直想用双栈法去做 一个栈存数字一个栈存运算符 但是当时可能是看到这道题是Hot100之外的 并且面试官一直看着我有点紧张所以就有一些细节一直没写对 最后面试官告诉我想复杂了 可以更简单一点)10. 最近在学习什么后端的方向11. 有用过Linux吗 平时开发用的是Windows还是linux觉得自己二面表现得很差 应该是要挂掉我了 没想到隔天HR打电话告诉我一二面都过了 但是因为只剩下一个hc了 想要更充分了解候选人所以再约一个三面 然后这个时候官网进度那里面试环节已经是打勾了三面情况:三面后刷新官网已挂三面没有问任何技术相关的 15分钟就结束了(面试官说一二面已经问过技术了我就不问了 心里瞬间就放松了 而且三面那天还发烧了) 单纯聊天 问我一些职业规划 还有一些个人情况什么的 然后面试官还问我为什么大二就出来实习 身边大二出来实习的多不多 未来规划是什么 我说我对技术很热爱 想学到企业开发的技术锻炼更多实战经验 然后他还问我你们学校是不是就在旁边 我说我骑个车三四分钟就到了哈哈哈(其实我经常去百度大厦下面吃麦当劳) 还问了我一些职场中的问题比如给你十个任务 每个任务优先级不一样 Deadline也不一样 如果是你的话你要怎么去在有限的时间内完成这些任务  感觉是HR面不是技术面 最后还问了我多大 聊天还挺愉快的最后自己觉得应该是被横向评估挂掉了 不过还是很感谢百度给了我人生中第一次面试的机会 遇到的面试官都都挺不错的 虽然面到了三面后把我挂了还是有点浇冷水的失落感 甚至三面之前官网进度那里面试那个选项就已经是打勾了的 然后三面完突然变成灰色了 诶 继续沉淀吧
装糖糕手:大二就开始找实习了吗,已经赢了 99% 的人
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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