Redis 消息队列详解

Redis-消息队列的三种方案(List、Streams、Pub-Sub) 即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备! 阅读详情
AI摘要

本文详细介绍了 Redis 作为高性能内存数据库实现消息队列的多种方式,包括 Redis List、Pub/Sub、Stream 和 Sorted Set。阐述了各方式的基本原理、生产者与消费者代码、适用场景及存在的问题与优化方法,并给出了选择合适消息队列的建议。

Redis 消息队列详解

Redis 作为一个高性能的内存数据库,支持多种实现消息队列的方式,主要包括:

  1. Redis List(基于列表的队列)
  2. Redis Pub/Sub(发布/订阅)
  3. Redis Stream(消息流)
  4. Redis Sorted Set(延迟队列)

不同的方式适用于不同的场景,下面详细讲解各自的实现原理、适用场景以及示例代码。


1. 基于 Redis List 的消息队列

Redis 的 List 结构(链表)可以用来实现 任务队列,支持持久化存储,并允许消费者从队列中取出任务进行处理。

1.1. 基本原理

  • LPUSH queue_name message:将新任务加入队列 头部。
  • RPUSH queue_name message:将新任务加入队列 尾部。
  • LPOP queue_name / RPOP queue_name:从队列头部/尾部取出任务(非阻塞)。
  • BRPOP queue_name timeout:阻塞方式获取任务,如果队列为空,会等待新的任务到来。

1.2. 生产者代码

import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# 添加任务到队列
r.lpush('task_queue', 'task1')
r.lpush('task_queue', 'task2')
print("Tasks added!")

1.3. 消费者代码

import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)

while True:
    task = r.brpop('task_queue', timeout=0)  # 阻塞模式
    if task:
        print(f"Processing task: {task[1]}")

1.4. 适用场景

  • 任务队列(Task Queue):适用于 任务分发 和 异步处理。
  • 多消费者竞争模式:多个消费者会竞争消费队列中的任务,每个任务只能被一个消费者取走。

1.5. 问题与优化

  • 消息丢失:如果消费者取出任务后崩溃,任务就会丢失。可以使用 RPOPLPUSH 实现任务持久化:
    task = r.rpoplpush('task_queue', 'processing_queue')
    if task:
        process(task)
        r.lrem('processing_queue', 1, task)  # 任务完成后删除
    
  • 限流:可以使用 Redis 令牌桶 或 滑动窗口算法 控制任务消费速率。

2. 基于 Redis Pub/Sub 的实时消息队列

Redis Pub/Sub 适用于实时广播通知,但不支持消息存储。

2.1. 基本原理

  • PUBLISH channel message:发布消息到频道。
  • SUBSCRIBE channel:订阅者监听频道消息。

2.2. 生产者代码

import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.publish('news_channel', 'Breaking News: Redis is awesome!')

2.3. 消费者代码

import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)

pubsub = r.pubsub()
pubsub.subscribe('news_channel')

for message in pubsub.listen():
    if message['type'] == 'message':
        print(f"Received message: {message['data']}")

2.4. 适用场景

  • 实时消息推送(如聊天系统、WebSocket)。
  • 事件驱动架构(如监控报警、状态变更通知)。

2.5. 问题与优化

  • 消息不会持久化,订阅者掉线后无法收到历史消息。
  • 不能回放消息,消息是实时的,一旦发送就无法重新获取。
  • 可以使用 Redis Stream 代替 来解决持久化问题。

3. 基于 Redis Stream 的持久化消息队列

Redis Stream 是一种高效、持久化的消息队列,支持消息存储、消费分组等特性,类似 Kafka。

3.1. 基本原理

  • XADD stream_name * field1 value1 field2 value2:添加消息。
  • XREAD COUNT 1 STREAMS stream_name last_id:读取消息。
  • XGROUP CREATE stream_name group_name $ MKSTREAM:创建消费组。

3.2. 生产者代码

import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.xadd('event_stream', {'event': 'user_signup', 'user_id': '12345'})
print("Event published!")

3.3. 消费者代码

import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)

while True:
    events = r.xread({'event_stream': '$'}, count=1, block=5000)
    for stream, messages in events:
        for message_id, message in messages:
            print(f"Received: {message}")

3.4. 适用场景

  • 大规模消息存储(Kafka 替代)。
  • 日志收集与分析。
  • 事件溯源(能回放历史消息)。

4. 基于 Redis Sorted Set 的延迟队列

Sorted Set(有序集合)可以用于定时任务调度。

4.1. 生产者代码

import time
import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.zadd('delay_queue', {'task1': time.time() + 10})  # 10秒后执行

4.2. 消费者代码

import time
import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)

while True:
    now = time.time()
    tasks = r.zrangebyscore('delay_queue', 0, now)
    for task in tasks:
        print(f"Processing {task}")
        r.zrem('delay_queue', task)
    time.sleep(1)

4.3. 适用场景

  • 定时任务(如定时短信、延迟执行)。
  • 超时检测(如订单过期、缓存清理)。

5. 选择合适的 Redis 消息队列

方案持久化支持多消费者适用场景
List✅竞争消费任务队列、异步任务
Pub/Sub❌广播消费实时推送、通知
Stream✅组消费事件流、日志收集
Sorted Set✅竞争消费延迟任务

总结

  • 如果需要任务队列,使用 List(支持竞争消费,适合任务调度)。
  • 如果需要实时推送,使用 Pub/Sub(广播消息,不存储)。
  • 如果需要持久化消息流,使用 Stream(类似 Kafka,支持回放)。
  • 如果需要定时任务,使用 Sorted Set(适合延迟队列)。
Redis-消息队列的三种方案(List、Streams,java基础教学pdf 有些简单的业务场景,可能不需要重量级的 MQ 组件(相比 Redis 来说,Kafka 和 RabbitMQ 都算是重量级的消息队列) 那你有考虑过用 Redis 做消息队列吗? 这一章,我会结合消息队列的特点和 Redis 做消息队列的使用方式,以及实际项目中的使用,来和大家探讨下 Redis 消息队列的方案。 一、回顾消息队列 消息队列 是指利用 高效可靠 的 消息传递机制 进行与平台无关的 数据交流,并基于数据通信来进行分布式系统的集成. 阅读详情

相关推荐

Redisson 操作 Redis Stream 消息队列详解及实战案例

除了RabbitMQ,还有Redis Stream

m0_74808313的博客 3022

Redis队列详解(springboot实战)

MQ应用有很多,比如ActiveMQ,RabbitMQ,Kafka等,但是也可以基于redis来实现,可以降低系统的维护成本和实现复杂度,本篇介绍redis中实现消息队列的几种方案,并通过springboot实战使其更易懂。 1. 基于List的 LPUSH+BRPOP 的实现 2. 基于Sorted-Set的实现 3. PUB/SUB,订阅/发布模式 4. 基于Stream类型的实现

qq_63815371的博客 9393

Redis消息队列实战:Stream方案详解与生产避坑指南

消息队列是系统解耦和流量削峰的关键组件,但传统重型MQ(如Kafka、RabbitMQ)的部署与运维成本很高。Redis作为广泛使用的基础组件,通过List、Pub/Sub和Stream数据结构,也能实现轻量级消息队列。其中Redis Stream支持持久化、消费组和消息确认机制,提供了接近专业MQ的可靠性,适合中低流量业务解耦与异步处理。在实际场景中,如订单履约、积分服务、短信通知等应用可稳定运行。本文深入拆解Redis实现消息队列的多种方案,重点讲解Stream的完整实战链路,包括生产消费、ACK确认、

weixin_32822843的博客 207

Redis队列

关于「把 Redis 当作队列来用是否合适」的问题。 有些人表示赞成,他们认为 Redis 很轻量,用作队列很方便。 也些人则反对,认为 Redis 会「丢」数据,最好还是用「专业」的队列中间件更稳妥。 从最简单的开始:List 队列 首先,我们先从最简单的场景开始讲起。 如果你的业务需求足够简单,想把 Redis 当作队列来使用,肯定最先想到的就是使用 List 这个数据类型。 因为 List 底层的实现就是一个「链表」,在头部和尾部操作元素,时间复杂度都是 O(1),这意味着它非常符合消息队列的模型。

xdscode的博客 1万+

Redis——DelayedQueue原理与应用

摘要 主要介绍的是的线程的IO模型的原理 Redis 是个单线程程序! 这点必须铭记。也许你会怀疑高并发的 Redis 中间件怎么可能是单线程。很抱歉,它就是单线程,你的怀疑暴露了你基础知识的不足。莫要瞧不起单线程,除了 Redis 之外, Node.js 也是单线程, Nginx 也是单线程,但是它们都是服务器高性能的典范。 Redis 单线程为什么还能这么快? 因为它所有的数据都在内存中,所有的运算都是内存级别的运算。正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些时

庄小焱 3197

Redis消息队列的操作详解

本文将详细介绍如何使用Python操作Redis消息队列,包括队列的创建、消息的发送与接收等操作。通过以上的操作,我们可以在Python中使用redis-py库对Redis消息队列进行创建、发送、接收、删除以及获取队列长度等操作。接收消息时,我们可以使用lpop命令从队列的左侧获取队列中的第一个消息。要发送消息到队列中,我们可以使用rpush命令将消息添加到队列的末尾。通过以上的代码和操作,我们可以在Python中轻松地使用redis-py库对Redis消息队列进行操作。

DxJavascript的博客 118

Redis Stream 消息队列详解

Redis Stream是Redis 5.0引入的消息队列数据结构,支持消息持久化、消费者组、消息回溯等特性。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 7707

DESeq2差异分析结果不会看?用这个R脚本5分钟生成发表级火山图和热图

本文详细介绍了如何使用R语言快速可视化DESeq2差异分析结果,5分钟内生成可直接用于论文发表的火山图和热图。通过解析DESeq2数据结构、展示ggplot2和EnhancedVolcano包的绘图技巧,以及pheatmap包的热图定制方法,帮助研究者高效呈现差异表达基因分析结果。

weixin_30326515的博客 340

Redis 作为消息队列详解

在现代分布式系统中,消息队列是一种常见的应用场景,广泛用于解耦系统各个模块、异步处理任务、提高系统的吞吐量和扩展性。Redis,作为一个高性能的内存数据库,其优秀的性能和灵活的特性使得它成为了构建消息队列的一个理想选择。 本文将详细介绍如何利用 Redis 构建高效的消息队列系统,分析 Redis 在作为消息队列时的特点、常用的消息队列模式、相关的实现策略、以及 Redis 作为消息队列的优势和局限性

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1849

Linux DRM驱动实战:手把手教你用drmModeSetCrtc显示纯色画面(附完整代码)

本文提供了一份完整的Linux DRM驱动实战指南,手把手教你使用drmModeSetCrtc在屏幕上显示纯色画面。文章详细解析了从打开设备、获取资源、创建帧缓冲区到最终提交画面的完整调用流程,并附带了可直接编译运行的完整代码示例,帮助开发者快速上手Linux图形底层开发。

weixin_29216353的博客 509

UE5新手必看:如何在UMG控件中嵌入浏览器实现Web页面展示(附完整步骤)

本文为UE5新手提供了在UMG控件中无缝集成Web浏览器的完整实战指南。详细介绍了从启用WebBrowser插件、创建并配置WebBrowser控件蓝图,到编写动态加载与交互逻辑,以及在游戏关卡中实例化UI的全过程。文章还分享了性能优化技巧与常见问题排查方法,帮助开发者高效实现游戏UI内的Web页面展示与交互。

weixin_29243063的博客 708

Redis Stream 消息队列详解及 PHP 实现

Redis Stream 是 Redis 5.0 引入的一种数据结构,专门用于实现高性能消息队列系统。

上善若水 802

手把手教程:使用C#实现工业上位机开发

深入讲解如何利用C#进行上位机开发,涵盖通信协议与界面设计,助力掌握工业自动化核心技能。结合实际案例,让上位机开发更高效直观。

weixin_32480007的博客 2063

redis消息队列mysql_详解Redis用链表实现消息队列

前言Redis链表经常会被用于消息队列的服务,以完成多程序之间的消息交换。个人认为redis消息队列有一个好处,就是可以实现分布式和共享,就和memcache作为mysql的缓存和mysql自带的缓存一样。链表实现消息队列Redis链表支持前后插入以及前后取出,所以如果往尾部插入元素,往头部取出元素,这就是一种消息队列,也可以说是消费者/生产者模型。可以利用lpush和rpop来实现。但是有一个问...

weixin_42571738的博客 277

万字长文:YOLOv5+RK3588 NPU多线程加速全攻略——从理论到部署的终极优化

RK3588 NPU多线程加速优化教程摘要 本教程深入讲解了如何利用线程池技术优化RK3588 NPU上的YOLO目标检测模型推理性能。RK3588内置3个NPU核心,理论算力达6TOPS,为多线程优化提供了硬件基础。教程详细解析了线程池的核心组件(任务队列、工作线程、同步机制)和实现架构,包括类设计、初始化流程、工作线程逻辑(任务获取、NPU推理、结果存储三个阶段)以及任务提交/获取机制。通过预分配模型实例、线程绑定、流量控制等优化手段,实现了从单线程28FPS到多线程120FPS的显著性能提升,为边缘A

LXY_LOVE36的博客 1098

备战2025数学建模国赛(算法46):多目标优化

本篇博客将深入浅出地介绍多目标优化的核心概念、主流算法,并重点结合一个数学建模竞赛的经典案例,提供完整的Python代码实现,助你在未来的竞赛中游刃有余。它通过寻找帕累托最优解集,完美地诠释了“鱼与熊掌不可兼得”的权衡思想,为最终决策提供科学依据。这些问题都包含多个相互冲突的目标,传统的单目标优化方法(如梯度下降、单纯形法)对此无能为力,因为它们无法同时优化多个目标。在数学建模竞赛中,我们面临的绝大多数问题都不是单一的“最好”,而是充满权衡与妥协的“最优”。记住,成功的建模不仅在于解出问题,更在于清晰地。

YOLO 282

Redis消息队列三大实现方法详解

Redis提供三种消息队列实现方式:基于List的LPUSH/RPOP适合简单队列场景,实现简单但需自行处理阻塞逻辑;基于Pub/Sub的发布订阅模式适用于实时通知,但缺乏消息持久化;基于Stream的持久化队列功能最完备,支持消费者组和ACK机制,适合复杂场景。三种方式各有优劣,其中Stream作为Redis5.0+引入的特性,整合了前两种方式的优点,是大多数业务场景的最优选择。开发者可根据业务需求选择不同实现方式,在系统解耦、异步处理和削峰填谷等场景中发挥重要作用。

2302_80029729的博客 721

OSG程序如何适配在无显卡的Ubuntu系统中

osg踩坑,希望遇到同样问题的人,可以尽快出坑,完美开发

大侠的后花园 459

Redis实现消息队列详解

redis实现消息队列详解

love and share 1667

Labview如何0基础自学快速入门?(纯干货帖)

讲解了如何学习Labview,Labview如何0基础入门,自学Labview的方法。什么都不会如何学好Labview的分享,欢迎关注文章~文章提供《Labview宝典》pdf下载,和《Labview虚拟仪器数据采集与通信控制》pdf下载

关注我,更多技术问题欢迎私聊~ 2万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

FastAPI-template消息队列实战:Redis、RabbitMQ、Kafka集成详解

FastAPI-template是一个功能丰富的FastAPI项目模板,提供了与三大主流消息队列(Redis、RabbitMQ和Kafka)的无缝集成能力。本文将详细介绍如何在FastAPI应用中利用该模板快速实现消息队列功能,帮助开发者轻松构建高性能的异步通信系统。 ## 消息队列集成概览 FastAPI-template通过统一的接口设计,让开发者能够轻松使用不同类型的消息队列服务。项目在

gitblog_00003的博客 1011

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

详解Redis消息队列的三种实现方案

Redis作为一种高效的内存数据库,提供了多种消息队列实现方案来满足不同场景的需求。本文将详细介绍Redis三种消息队列方案:List、Pub/Sub和Streams,并分析其差异,同时通过JAVA代码进行消费案例实现,帮助大家更好的理解和选择。

qq_33479841的博客 1296

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

突破12306抢票瓶颈:Redis消息队列异步处理架构详解

py12306是一款功能强大的12306购票助手,支持集群部署、多账号管理和多任务并行购票,通过Web页面实现便捷管理。本文将深入解析其基于Redis消息队列的异步处理架构,揭示如何通过分布式设计突破抢票过程中的性能瓶颈,让你轻松掌握高并发场景下的抢票技术原理。 ## 为什么传统抢票工具总是"慢人一步"? 在票务高峰期,12306网站往往面临巨大的访问压力,传统抢票工具采用的同步请求模式容易导

gitblog_00906的博客 352

消息队列的设计与Redis Stream详解为例

用过Redis做消息队列的都了解,基于Reids的消息队列实现有很多种,例如:为什么上面的结构无法满足广泛的MQ场景? 这里便引出一个核心的问题:如果我们期望设计一种数据结构来实现消息队列,最重要的就是要理解**设计一个消息队列需要考虑什么?**初步的我们很容易想到解耦是消息队列要解决的最本质问题。所谓解耦,简单点讲就是一个事务,只关心核心的流程。而需要依赖其他系统但不那么重要的事情,有通知即可,无需等待结果。换句话说,基于消息的模型,关心的是“通知”,而非“处理”。 比如在美团旅游,我们有一个产品中心,产

ltd_201231的博客 772

Redis Stream:Redis 5.0+新数据结构详解,替代消息队列的新选择

Redis Stream 是 Redis 5.0 引入的新型数据结构,专为消息队列和事件流处理设计。它兼具有序性和消息传递能力,支持持久化存储、消费者组、ACK确认机制和时间序列特性。基础操作包括XADD添加消息、XRANGE/XREAD读取消息,以及消费者组的创建与管理。实战中可用于订单事件流处理(记录订单状态变更)和实时日志分析(多消费者协作处理日志)。相比传统List和Pub/Sub,Stream提供了更可靠的消息传递机制,是构建分布式消息系统的理想选择。

m0_75126572的博客 1140

redis中stream数据结构使用详解——redis最适合做消息队列的数据结构

Redis Stream 是 Redis 5.0 版本新增加的数据结构。Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。

秃了也弱了 2806
上一篇: 使用 Redis List 和 Pub/Sub 实现简单的消息队列
下一篇: Redis 的热 Key(Hot Key)问题及解决方法
maply
博客等级 码龄18年 3493粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值