Java面试八股之Redis怎么实现消息队列

  1. Redis怎么实现消息队列

Redis实现消息队列主要依赖于其内置的数据结构,如List、Pub/Sub(发布/订阅)和Stream。下面将分别介绍这三种方式及其特点:

1. List实现消息队列

Redis的List是一个双向链表,支持快速的头部和尾部插入和删除操作,这使得它非常适合用来实现消息队列。

实现方式:

生产消息:使用LPUSH或RPUSH命令将消息推入列表的一端。

消费消息:使用LPOP或RPOP命令从列表的另一端移除并获取消息。但需要注意,RPOP在队列为空时会返回null,不会阻塞等待,因此更常用的是BRPOP(阻塞式列表弹出原语)来实现阻塞等待。

优点:

利用Redis存储,不受限于JVM内存上限。

基于Redis的持久化机制,数据安全性有保证。

可以满足消息有序性。

缺点:

无法避免消息丢失(如消费者拿到消息还未消费就宕机)。

只支持单消费者(除非使用多个List作为队列)。

2. Pub/Sub(发布/订阅)

Pub/Sub是Redis 2.0版本引入的消息传递模型,允许生产者发送消息到一个或多个channel,订阅了这些channel的消费者都能接收到消息。

基本命令:

SUBSCRIBE channel [channel ...]:订阅一个或多个频道。

PUBLISH channel message:向一个频道发送消息。

UNSUBSCRIBE [channel ...]:取消订阅一个或多个频道。

优点:

采用发布订阅模式,支持多生产者、多消费者。

消息即时发送,无需等待消费者读取。

缺点:

不支持数据持久化,消息一旦发布,若消费者不在线,则消息丢失。

消息堆积有上限,超出时数据丢失。

3. Stream消息队列

Stream是Redis 5.0之后引入的新数据类型,支持多播的可持久化消息队列,其设计借鉴了Kafka。

基本命令:

XADD key ID field value [field value ...]:向Stream添加消息。

XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]:从Stream读取消息。

XGROUP CREATE key groupName ID [MKSTREAM]:创建消费者组。

XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]:从消费者组读取消息。

XACK key group ID [ID ...]:确认消息已被处理。

特点:

消息可回溯,消费者可以读取历史消息。

支持多消费者争抢消息,消息分流给组内的不同消费者,加快消息处理速度。

有消息确认机制,保证消息至少被消费一次。

持久化支持,消息不会因Redis重启而丢失。

总结

Redis通过其内置的List、Pub/Sub和Stream数据结构提供了多种实现消息队列的方式。选择哪种方式取决于具体的应用场景和需求,如消息的有序性、持久化、消费者数量等因素。对于需要持久化、消息有序且消费者数量较多的场景,Stream是一个较好的选择。而对于简单的发布订阅需求,Pub/Sub则更为轻量级和灵活。List则适用于简单的队列场景,但需要注意消息丢失和单消费者的问题。

 如果大家需要视频版本的讲解,欢迎关注我的B站:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1484000.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux/Windows】Wireshark抓包工具下载、安装、使用、数据分析、常用知识点

文章目录 Linux版下载Windows版下载Wireshark使用Wireshark测试Tcp三次握手Wireshark常见过滤条件本篇小结 更多相关内容可查看 在一个阳光明媚的周五清晨,一起快乐的玩耍一下Wireshark Linux版下载 1.使用yum安装wireshark yum -y install wireshark2.使用yum安…

TDC 5.0:多集群统一纳管,构建一体化大数据云平台

近期,星环科技数据云平台Transwarp Data Cloud(简称TDC)5.0版本正式发布,TDC5.0架构屏蔽底层多个TDH集群的差异,采用统一操作模式,新增一个多集群抽象与管理层,能够实现多集群网络互通、跨集群资…

一文搞懂Java中的双亲委派

一天正在宿舍里忙着写代码。突然,老师给我布置了一项新任务:优化他正在开发的项目中的类加载机制。我对类加载器了解不多,开始翻阅各种资料,逐渐了解了Java中的类加载器机制。尤其是当读到双亲委派模型时,脑海中豁然开…

【鸿蒙学习笔记】舜和酒店项目开发

这里写目录标题 前期准备1. 环境准备2. 开发工具准备 创建项目1. 使用 deveco-studio 创建 ShunHeHotel 项目2. 把ShunHeHotel 项目使用git进行版本控制3. 提交第1个commit,Alt0 → 输入commit message → 提交4. 查看已经提交的第一个提交5. gitcode 创建同名远程项…

微信小程序毕业设计-选课系统项目开发实战(附源码+论文)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

杭州外贸网站建设 最好用wordpress模板来搭建

防护服wordpress外贸网站模板 消防服、防尘服、隔热服、防化服、防静电服、电焊服wordpress外贸网站模板。 https://www.jianzhanpress.com/?p4116 工业品wordpress外贸网站模板 机械及行业设备、五金工具、安全防护、包装、钢铁、纺织皮革等工业品wordpress外贸网站模板。…

家庭主妇人格独立问题,不断成长自己,保持人格独立

86天 周六反省 家庭主妇人格独立问题; 深刻反省自己,成长、改变自己;身体有毛病就去治疗,心上有问题就去改正;多年形成的习惯需要下功夫填坑 无论在哪个时刻我们都应该成长自己、人格独立,和爱人一起成长…

卷积神经网络【CNN】--池化层的原理详细解读

池化层(Pooling Layer)是卷积神经网络(CNN)中的一个关键组件,主要用于减少特征图(feature maps)的维度,同时保留重要的特征信息。 一、池化层的含义 池化层在卷积神经网络中扮演着降…

mac如何合并pdf文件到一个文件 macpdf合并 Mac如何合并pdf文件

在数字化的今天,pdf文件因其跨平台、格式统一等优势,已经成为工作、学习和生活中不可或缺的文件格式。然而,当我们需要合并多个pdf文件时,可能会感到有些无从下手。本文将为你详细介绍几种简单实用的合并pdf的方法,让你…

使用Tailwind CSS实现响应式面板

本文由ScriptEcho平台提供技术支持 项目地址:传送门 代码应用场景 此代码旨在用作 Web 应用程序或软件平台的仪表板界面。它提供结构化布局,包含多个部分,用于显示关键统计数据、最近活动和用户管理功能。仪表板旨在提供基本数据的全面概述…

第十四届蓝桥杯省赛C++B组H题【整数删除】题解(AC)

题目大意 依次删除长度为 n n n 的数组中的 k k k 个最小值,在删除一个数后,该数的相邻数加上它的值,输出最终数组。 解题思路 数组中删除一个数的复杂度为 O ( n ) O(n) O(n),故我们可以考虑用链表进行维护,这样…

3112. 访问消失节点的最少时间 Medium

给你一个二维数组 edges 表示一个 n 个点的无向图,其中 edges[i] [ui, vi, lengthi] 表示节点 ui 和节点 vi 之间有一条需要 lengthi 单位时间通过的无向边。 同时给你一个数组 disappear ,其中 disappear[i] 表示节点 i 从图中消失的时间点&#xff0…

【hadoop大数据集群 2】

【hadoop大数据集群 2】 文章目录 【hadoop大数据集群 2】1. 虚拟机克隆2. 时间同步3. 环境变量配置、启动集群、关闭集群 1. 虚拟机克隆 克隆之后一定要重新生成新虚拟机唯一的MAC地址和UUID等,确保新虚拟机与源虚拟机在网络拓扑中不发生冲突。 注意1.生成新的MA…

【C++】C++设计远程桌面软件的技术详解

在当今的数字化时代,远程桌面技术已成为企业远程办公、技术支持、教育培训等领域不可或缺的一部分。它允许用户从任何地点通过互联网安全地访问和控制远程计算机,就像直接坐在那台计算机前一样。C作为一种高效、灵活且性能强大的编程语言,非常…

C++ 继承详解:从基础到深入

继承是面向对象编程中最强大的功能之一,它不仅促进了代码的重用,还帮助我们构建复杂的系统。在C中,通过继承,我们可以创建一个新的类(称为派生类)来扩展现有类(基类)的功能。本文将全…

复学数据结构

1.for循环 c中的for循环和js的for循环用法一样 for (初始化表达式; 条件表达式; 递增/递减表达式) {// 循环体 } 2.数组 1)时间复杂度 算法 平均情况 最坏情况 访问 O(1) O(1) 搜索 O(n) O(n) 插入 O(n) O(n) 删除 O(n) O(n) 2)C 将高维维数组存…

10个常见的电缆载流表,值得收藏!

众所周知,电线电缆的载流是所有电工、电气人员都必须具备的基本储备,但是如果要将那么多的“数字”都记得清清楚楚,还是有一点困难的!今天咱们就做了一个电力电缆载流量对照表,速度收藏!下次参考不迷路! 1、0.6/1KV聚氯乙烯绝缘电力电缆载流量 以上电缆载流量计算条件:…

一个小问题导致,AI大模型集体翻车?

9.11大还是9.9大? 这两天大家都在说ChatGPT大模型翻车了 ! 这到底是怎么个事儿呢? 原来是最近有人想ChatGPT等大模型提了一个简单的问题: 9.11 大还是 9.9 大? 答案显而易见,然而众多大模型却给出了错误…

AI小白也能驾驭!10款免费工具让你秒变高手

市面上的AI工具种类繁多,覆盖了从创意设计到日常工作处理的各个领域。下面列出了10款实用的AI工具,它们能帮你在不同场景下提升效率,解决实际问题: Aicbo:这个在线生成工具可以根据你提供的描述生成图像,适…

鸿蒙开发error: failed to start ability

鸿蒙开发项目编译过后不能启动 项目在模拟器运行报: error: failed to start ability. Error while Launching ability 解决办法: 1,看了一些文章说是把module.json5配置文件中的"exported"由false改成true,没有解…