当前位置: 首页 > news >正文

使用 Redis List 和 Pub/Sub 实现简单的消息队列

使用 Redis List 和 Pub/Sub 实现简单的消息队列

Redis 本身不是专门的消息队列系统,但它提供了多种数据结构(如 List、Pub/Sub、Stream)来实现消息队列功能。根据不同的业务需求,可以选择不同的方式:

在 Redis 中,可以使用 ListPub/Sub 模块实现简单的消息队列。两者的适用场景和实现方式有所不同:

  • List(列表):适用于任务队列(Task Queue),支持持久化存储,消费者可以消费历史消息,支持 多消费者竞争消费(类似于 Kafka)。
  • Pub/Sub(发布/订阅):适用于实时推送(Event Notification),不存储消息,消费者只能接收发布时刻的消息,适合 多消费者广播消费(类似于 RabbitMQ Fanout)。

方式一:使用 Redis List 实现简单的消息队列

Redis 的 LPUSHBRPOP 操作可以用来构建一个 基于拉取的消息队列

1. 生产者(Producer)

生产者将消息推送到 Redis List 的尾部:

LPUSH my_queue "message1"
LPUSH my_queue "message2"

或在 Python 中:

import redisr = redis.Redis(host='localhost', port=6379, decode_responses=True)
r.lpush('my_queue', 'message1')
r.lpush('my_queue', 'message2')
  • LPUSH my_queue "message":将新消息插入队列的 左侧(头部)
  • RPUSH my_queue "message" 也可以使用,它会将消息插入队列的 右侧(尾部)

2. 消费者(Consumer)

消费者使用 BRPOP(阻塞)或 RPOP(非阻塞)从队列的 右侧 弹出消息:

BRPOP my_queue 0

或在 Python 中:

while True:msg = r.brpop('my_queue', timeout=0)  # 阻塞模式if msg:print("Received:", msg[1])  # msg[1] 是消息内容
  • BRPOP my_queue 0:如果队列为空,则 阻塞 等待新的消息。
  • RPOP my_queue:如果队列为空,直接返回 None,不会阻塞。

3. 多消费者

多个消费者可以竞争消费消息,即每条消息只会被 其中一个 消费者消费。例如,有两个消费者在 BRPOP 同一个队列,Redis 只会把某个消息分配给其中一个。

4. 消息确认与持久化

由于 Redis List 只存储消息,不支持自动重试,因此可以配合 LPUSH+RPOPLPUSH 事务 实现持久化:

  • 先用 RPOPLPUSH my_queue processing_queue 把消息从 my_queue 转移到 processing_queue,然后再处理。
  • 处理完成后,从 processing_queue 中删除该消息。
msg = r.rpoplpush('my_queue', 'processing_queue')  # 转移到处理中队列
if msg:process_message(msg)  # 处理消息r.lrem('processing_queue', 1, msg)  # 处理完成后删除

方式二:使用 Redis Pub/Sub 实现消息队列

Pub/Sub 适用于实时消息推送,消息不会存储,适合事件广播。

1. 生产者(Publisher)

发布者向某个频道(channel)发送消息:

PUBLISH my_channel "message1"

或在 Python 中:

r.publish('my_channel', 'message1')

2. 消费者(Subscriber)

订阅者监听消息:

SUBSCRIBE my_channel

或在 Python:

pubsub = r.pubsub()
pubsub.subscribe('my_channel')for message in pubsub.listen():if message['type'] == 'message':print("Received:", message['data'].decode())

3. Pub/Sub 适用场景

  • 实时消息推送(如 WebSocket、聊天室)。
  • 事件驱动系统(如日志收集、状态变更通知)。
  • 多消费者广播消费,所有订阅者都会收到相同的消息。

4. Pub/Sub 局限性

  • 消息 不会持久化,如果订阅者掉线,它不会收到丢失的消息。
  • 不能确保 消息按顺序消费
  • 无法回溯历史消息(相比 Kafka)。

总结:Redis List vs Pub/Sub

特性Redis ListRedis Pub/Sub
消息存储存储在 List,直到被消费不存储,实时传输
消费者模型多消费者竞争消费(类似任务队列)多消费者广播消费(类似事件通知)
可靠性支持重试和确认机制订阅者掉线会丢失消息
适用场景任务队列(如延迟任务、任务分发)实时推送(如聊天、事件通知)

如果需要 持久化队列,建议使用 Redis List;如果只是 实时推送,可以用 Pub/Sub


相关文章:

使用 Redis List 和 Pub/Sub 实现简单的消息队列

使用 Redis List 和 Pub/Sub 实现简单的消息队列 Redis 本身不是专门的消息队列系统,但它提供了多种数据结构(如 List、Pub/Sub、Stream)来实现消息队列功能。根据不同的业务需求,可以选择不同的方式: 在 Redis 中&a…...

本地项目上传到码云

本地项目上传到码云 写在前面1. 系统安装git环境2. 创建仓库3. 开始上传3.1 创建新的远程仓库3.2 在项目的文件夹用git打开3.3 删除本地的 .git 目录3.4 初始化新的 Git 仓库3.5 添加远程仓库3.6 添加项目文件3.7 提交更改3.8 推送到远程仓库3.9 验证 4. 完整的步骤总结写在最后…...

Ansible入门学习之基础元素介绍

一、Ansible目录结构介绍 1.通过rpm -ql ansible获取ansible所有文件存放的目录 有配置文件目录 /etc/ansible/ 执行文件目录 /usr/bin/ 其中 /etc/ansible/ 该文件目录的主要功能是 inventory主机信息配置,ansible工具功能配置。 ansible自身的配置文件…...

大数据治理实战指南:数据质量、合规与治理架构

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 引言 随着企业数字化转型的加速,大数据已成为驱动业务决策的核心资产。然而,数据治理的缺失或不完善&…...

leetcode_链表 234.回文链表

234.回文链表 给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是, 返回 true ; 否则, 返回false。思路: 找到中间节点(快慢指针法)反转后半部分的链表比较前半部分和后半部分链表 # Definition for singly-linked list. # class List…...

[Dialog屏幕开发] 屏幕绘制(下拉菜单)

阅读该篇文章之前,可先阅读下述资料 [Dialog屏幕开发] Table Control 列数据操作https://blog.csdn.net/Hudas/article/details/145343731?spm1001.2014.3001.5501https://blog.csdn.net/Hudas/article/details/145343731?spm1001.2014.3001.5501https://blog.cs…...

deepseek v1手机端部署

在iPhone上部署DeepSeekR1 1. 安装快捷指令: 打开iPhone上的Safari浏览器,访问[这个链接](https://www.icloud.com/shortcuts/e0bc5445c39d45a78b90e1dc896cd010)下载快捷指令。 下载后,按照提示完成安装。 2. 获取并配置API Key&a…...

CVPR 2024 无人机/遥感/卫星图像方向总汇(航空图像和交叉视角定位)

1、UAV、Remote Sensing、Satellite Image(无人机/遥感/卫星图像) Unleashing Unlabeled Data: A Paradigm for Cross-View Geo-Localization ⭐codeRethinking Transformers Pre-training for Multi-Spectral Satellite Imagery ⭐codeAerial Lifting: Neural Urban Semantic …...

【信息系统项目管理师-选择真题】2015下半年综合知识答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...

Baklib如何结合内容中台与人工智能技术实现数字化转型

内容概要 在当前快速发展的数字环境中,企业面临着转型的紧迫性与挑战,尤其是在内容管理和用户互动的领域。内容中台作为一种集成化的解决方案,不仅能够提高企业在资源管理方面的效率,还能够为企业提供一致性和灵活性的内容分发机…...

JAVAweb学习日记(八) 请数据库模型MySQL

一、MySQL数据模型 二、SQL语言 三、DDL 详细见SQL学习日记内容 四、DQL-条件查询 五、DQL-分组查询 聚合函数: 分组查询: 六、DQL-分组查询 七、分页查询 八、多表设计-一对多&一对一&多对多 一对多-外键: 一对一: 多…...

自动驾驶---苏箐对智驾产品的思考

1 前言 对于更高级别的自动驾驶,很多人都有不同的思考,方案也好,产品也罢。最近在圈内一位知名的自动驾驶专家苏箐发表了他自己对于自动驾驶未来的思考。 苏箐是地平线的副总裁兼首席架构师,同时也是高阶智能驾驶解决方案SuperDri…...

python——Django 框架

Django 框架 1、简介 Django 是用python语言写的开源web开发框架,并遵循MVC设计。 Django的**主要目的是简便、快速的开发数据库驱动的网站。**它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架,Django有许多功能…...

计算机视觉-卷积

卷积-图像去噪 一、图像 二进制 灰度 彩色 1.1二进制图像 0 1 一个点可以用一个bit(0/1)来表示 1.2灰度图像 0-255 一个点可以用一个byte来表示 1.3彩色图像 RGB 表达一个彩色图像先说它的分辨率p/w(宽)和q/h(高…...

Spring Boot 自定义属性

Spring Boot 自定义属性 在 Spring Boot 应用程序中,application.yml 是一个常用的配置文件格式。它允许我们以层次化的方式组织配置信息,并且比传统的 .properties 文件更加直观。 本文将介绍如何在 Spring Boot 中读取和使用 application.yml 中的配…...

C++ list 容器用法

C list 容器用法 C 标准库提供了丰富的功能&#xff0c;其中 <list> 是一个非常重要的容器类&#xff0c;用于存储元素集合&#xff0c;支持双向迭代器。<list> 是 C 标准模板库&#xff08;STL&#xff09;中的一个序列容器&#xff0c;它允许在容器的任意位置快速…...

《 C++ 点滴漫谈: 二十四 》深入 C++ 变量与类型的世界:高性能编程的根基

摘要 本文深入探讨了 C 中变量与类型的方方面面&#xff0c;包括变量的基本概念、基本与复合数据类型、动态类型与内存管理、类型推导与模板支持&#xff0c;以及类型系统的高级特性。通过全面的理论讲解与实际案例分析&#xff0c;展示了 C 类型系统的强大灵活性与实践价值。…...

C语言初阶牛客网刷题—— HJ34 图片整理【难度:中等】

1. 题目描述 牛客网在线OJ链接 Lily上课时使用字母数字图片教小朋友们学习英语单词&#xff0c;每次都需要把这些图片按照大小&#xff08;ASCII码值从小到大&#xff09;排列收好。请大家给Lily帮忙&#xff0c;通过C语言解决。 输入描述&#xff1a;Lily使用的图片包括 “A…...

小盒科技携手体验家,优化智能教育服务体验,打造在线教育新高度

北京小盒科技有限公司&#xff08;简称“小盒科技”&#xff0c;由“作业盒子”更名而来&#xff09;是一家专注于教育科技的公司&#xff0c;致力于利用人工智能、大数据等先进技术&#xff0c;为中小学教育提供创新的解决方案和产品。 近日&#xff0c;「小盒科技」携手体…...

一个简单的自适应html5导航模板

一个简单的 HTML 导航模板示例&#xff0c;它包含基本的导航栏结构&#xff0c;同时使用了 CSS 进行样式美化&#xff0c;让导航栏看起来更美观。另外&#xff0c;还添加了一些 JavaScript 代码&#xff0c;用于在移动端实现导航菜单的展开和收起功能。 PHP <!DOCTYPE htm…...

Windows系统下Neo4j社区版手动安装与配置指南(非Docker方案)

1. 环境准备&#xff1a;JDK安装与验证 在Windows系统下手动安装Neo4j社区版&#xff0c;第一步就是搞定Java环境。我见过太多新手卡在这一步&#xff0c;其实只要注意几个关键点就能轻松过关。Neo4j作为基于Java开发的图数据库&#xff0c;必须依赖JDK才能运行&#xff0c;但不…...

逆向实战:用Smali语法修改APK逻辑,实现一个简单的功能破解(附工具与源码)

逆向工程实战&#xff1a;用Smali语法解锁APK功能的全流程指南 在Android逆向工程领域&#xff0c;掌握Smali语法就像获得了一把打开APK内部逻辑的万能钥匙。不同于那些停留在理论层面的教程&#xff0c;本文将带你深入一个真实的逆向场景——如何通过修改Smali代码来解锁某个演…...

球阀市场增长预测:预计到2032年将增长至1473.1亿元

据恒州诚思调研统计&#xff0c;2025年全球球阀市场规模达1078.8亿元&#xff0c;预计到2032年将增长至1473.1亿元&#xff0c;2026-2032年复合增长率&#xff08;CAGR&#xff09;为4.5%。同期&#xff0c;全球球阀产量达19,894万件&#xff0c;平均售价为75美元/件。作为流体…...

从一道蓝桥杯EDA赛题,聊聊平衡车硬件设计中那些‘不起眼’却关键的安全电路

平衡车硬件设计中的安全电路&#xff1a;从蓝桥杯赛题到工程实战 去年调试一款平衡车原型机时&#xff0c;我曾遇到一个诡异现象&#xff1a;每次电池快耗尽时&#xff0c;电机就会突然失控。经过三天排查&#xff0c;最终发现问题出在电源检测电路的分压电阻取值上——这个看似…...

UICKeyChainStore常见问题解答:解决开发者遇到的典型问题

UICKeyChainStore常见问题解答&#xff1a;解决开发者遇到的典型问题 【免费下载链接】UICKeyChainStore UICKeyChainStore is a simple wrapper for Keychain on iOS, watchOS, tvOS and macOS. Makes using Keychain APIs as easy as NSUserDefaults. 项目地址: https://gi…...

状态量: 轮速、滑移率、附着系数

基于分布式驱动电动汽车的路面附着系数估计&#xff0c;分别采用无迹卡尔曼滤波&#xff08;UKF&#xff09;和容积卡尔曼滤波&#xff08;CKF&#xff09;对电动汽车四个车轮的路面附着系数进行估计。可高速&#xff0c;低速&#xff0c;高附着系数&#xff0c;低附着系数&…...

这家“冠军机器狗”企业广募人才 | 智身科技:邀你一起玩转具身智能

不止于工作&#xff0c;这是一场定义未来的邀约&#xff0c;一起奔赴具身智能的广阔未来。 01 我们是谁 智身科技成立于2023年&#xff0c;是一家专注于具身智能领域的高新技术企业。我们以自主研发为核心&#xff0c;构建了从核心部件、整机制造到场景化落地的全链条能力。 技…...

单片机入门到实践:51系列开发全攻略

单片机从零入门到项目实践的技术路径1. 单片机学习基础准备1.1 必备知识体系学习单片机开发需要构建以下基础知识框架&#xff1a;电路基础&#xff1a;包括欧姆定律、基尔霍夫定律等基本电路理论数字电路&#xff1a;逻辑门电路、时序电路、组合逻辑电路等模拟电路&#xff1a…...

告别纯理论:用OAI 5G开源平台+USRP B210硬件,实测端到端5G SA数据业务

从零构建5G SA实验环境&#xff1a;OAI开源平台与USRP B210实战指南 当5G技术从实验室走向商业化应用时&#xff0c;许多开发者面临一个尴尬的现实&#xff1a;理论知识与实际操作之间存在巨大鸿沟。本文将带你跨越这道鸿沟&#xff0c;使用OAI开源平台和USRP B210软件定义无线…...

3分钟解决NCM格式难题:ncmdumpGUI让你的音乐重获自由 [特殊字符]

3分钟解决NCM格式难题&#xff1a;ncmdumpGUI让你的音乐重获自由 &#x1f3b5; 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 还在为网易云音乐的NCM格式文件…...