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://xiahunao.cn/news/3250430.html

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

相关文章

ARM架构(二)—— arm v7/v8/v9寄存器介绍

1、ARM v7寄存器 1.1 通用寄存器 V7 V8开始 FIQ个IRQ优先级一样, 通用寄存器:31个 1.2 程序状态寄存器 CPSR是程序状态毒存器,保存条件标志位,中断禁止位,当前处理器模式等控制和状态位。每种异常模式下还存在SPSR&…

Unity扩展SVN命令

可以直接在unity里右键文件提交和查看提交记录 顶部菜单栏上回退和更新整个unity工程 SvnForUnity.CS 记得要放在Editor文件夹下 using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using UnityEditor; using Unity…

互联网行业的产品方向(二)

数字与策略产品 大数据时代,数据的价值越来越重要。大多数公司开始对内外全部数据进行管理与挖掘,将业务数据化,数据资产化,资产业务化,将数据产品赋能业务,通过数据驱动公司业务发展,支撑公司战…

PyTorch使用细节

model.eval() :让BatchNorm、Dropout等失效; with torch.no_grad() : 不再缓存activation,节省显存; 这是矩阵乘法: y1 tensor tensor.T y2 tensor.matmul(tensor.T)y3 torch.rand_like(y1) torch.matm…

19_Shell练习题

19_Shell练习题 一、获取并打印空行行号 awk /^$/{print NR} test.txt二、求一列的和 awk -v sum0 { sum$2 } END{ print sum } test.txt三、检查文件是否存在 #!/bin/bashecho "请输入要查询文件的全路径名称:" read -p "例如:/temp…

(MLLMs)多模态大模型论文分享(1)

Multimodal Large Language Models: A Survey 摘要:多模态语言模型的探索集成了多种数据类型,如图像、文本、语言、音频和其他异构性。虽然最新的大型语言模型在基于文本的任务中表现出色,但它们往往难以理解和处理其他数据类型。多模态模型…

Volatility:分析MS10-061攻击

1、概述 # 1)什么是 Volatility Volatility是开源的Windows,Linux,MaC,Android的内存取证分析工具。基于Python开发而成,可以分析内存中的各种数据。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统…

AI算不出9.11和9.9哪个大?六家大模型厂商总结了这些原因

大模型“答对”或“答错”其实是个概率问题。关于“9.11和9.9哪个大”,这样一道小学生难度的数学题难倒了一众海内外AI大模型。7月17日,第一财经报道了国内外“12个大模型8个都会答错”这道题的现象,大模型的数学能力引发讨论。 “从技术人员…

《系统架构设计师教程(第2版)》第12章-信息系统架构设计理论与实践-02-信息系统架构

文章目录 1. 概述1.1 信息系统架构(ISA)1.2 架构风格 2. 信息系统架构分类2.1 信息系统物理结构2.1.1 集中式结构2.1.2 分布式结构 2.2 信息系统的逻辑结构1)横向综合2)纵向综合3)纵横综合 3. 信息系统架构的一般原理4…

C++从入门到起飞之——this指针 全方位剖析!

个人主页:秋风起,再归来~ C从入门到起飞 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安! 目录 1、this指针 2、C和C语⾔实现Stack对⽐ C实现Stack代码 C实现Stack代…

排序系列 之 快速排序

!!!排序仅针对于数组哦本次排序是按照升序来的哦代码后边有图解哦 介绍 快速排序英文名为Quick Sort 基本思路 快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素base,利用base将待排序的序列分…

Spring纯注解开发

前言 Spring3.0引入了纯注解开发的模式,框架的诞生是为了简化开发,那注解开发就是简化再简化。Spring的特性在整合MyBatis方面体现的淋漓尽致哦 一.注解开发 以前跟老韩学习SE时他就说:注解本质是一个继承了Annotation 的特殊接口,其具体实…

Unity免费领7月开发者周冰雪世界着色器环境包180种冰材质544种预制变体冰天雪地环境效果限时免费领取20240719

7月19号的Unity开发者周限时免费资产更新啦,这次是冰雪材质和环境素材包,质量挺不错。 之前进过捆绑包, 结帐时输入NATUREMANUFACTURE2024优惠券代码即可免费获得。无需购买。 Unity免费领7月开发者周冰雪世界着色器环境包180种冰材质544种…

DevExpress WinForms自动表单布局,创建高度可定制用户体验(一)

使用DevExpress WinForms的表单布局组件可以创建高度可定制的应用程序用户体验,从自动安排UI控件到按比例调整大小,DevExpress布局和数据布局控件都可以让您消除与基于像素表单设计相关的麻烦。 P.S:DevExpress WinForms拥有180组件和UI库&a…

系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划(ERP)-解读

系统架构设计师教程 第3章 信息系统基础知识-3.7 企业资源规划(ERP) 3.7.1 企业资源规划的概念3.7.2 企业资源规划的结构3.7.2.1 生产预测3.7.2.2 销售管理(计划)3.7.2.3 经营计划(生产计划大纲)3.7.2.4 …

【人工智能大模型】文心一言介绍以及基本使用指令

目录 一、产品背景与技术基础 二、主要功能与特点 基本用法 指令的使用 注意事项 文心一言(ERNIE Bot)是百度基于其文心大模型技术推出的生成式AI产品。以下是对文心一言的详细介绍: 一、产品背景与技术基础 技术背景:百度…

初学Linux之常见指令(上)

初学Linux之常见指令(上) 文章目录 初学Linux之常见指令(上)1. Linux下的小技巧热键man 指令 2. ls 指令3. pwd 指令4. cd 指令5. tree 指令6. touch 指令7. mkdir 指令8. rmdir 和 rm 指令9. cp 指令10. mv 指令 1. Linux下的小技…

PolarisMesh源码系列--Polaris-Go注册发现流程

导语 北极星是腾讯开源的一款服务治理平台,用来解决分布式和微服务架构中的服务管理、流量管理、配置管理、故障容错和可观测性问题。在分布式和微服务架构的治理领域,目前国内比较流行的还包括 Spring Cloud,Apache Dubbo 等。在 Kubernete…

英文名字网/英文取名/英语起名网源码/带文章系统带采集PHP网站程序

英文名字网/英文取名/英语起名网源码/带文章系统带采集PHP网站程序 演示站: https://enname.wengu8.com/ 程序截图: 程序说明: 1、前端模板PC手机端自适应。 2、全部数据带25W名字数据,后台可编辑,包括json格式的…

【Docker】Docker-compose 单机容器集群编排工具

目录 一.Docker-compose 概述 1.容器编排管理与传统的容器管理的区别 2.docker-compose 作用 3.docker-compose 本质 4.docker-compose 的三大概念 二.YML文件格式及编写注意事项 1.yml文件是什么 2.yml问价使用注意事项 3.yml文件的基本数据结构 三.Docker-compose …