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

news2024/9/16 14:32:11
  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.coloradmin.cn/o/1935302.html

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

相关文章

【学术会议征稿】第六届信息与计算机前沿技术国际学术会议(ICFTIC 2024)

第六届信息与计算机前沿技术国际学术会议(ICFTIC 2024) 2024 6th International Conference on Frontier Technologies of Information and Computer 第六届信息与计算机前沿技术国际学术会议(ICFTIC 2024)将在中国青岛举行,会期是2024年11月8-10日,为…

Python面试宝典第15题:岛屿数量

题目 在二维网格地图上,1 表示陆地,0 表示水域。如果相邻的陆地可以水平或垂直连接,则它们属于同一块岛屿。请进行编码,统计地图上的岛屿数量。比如:下面的二维网格地图,其岛屿数量为3。 基础知识 解决这类…

Linux入门以及Linux文件编程学习

Linux学习必备 首先我们学习Linux必须安装一个虚拟机,我是跟着韦东山老师安装的,具体可以跟着视频操作,简单易懂:安装虚拟机 Linux入门最基本简单的指令 一、Vi的使用 Vi文件名 创建或者打开一个文件,进入默认命令行…

[论文笔记] pai-megatron-patch Qwen2-CT 长文本rope改yarn

更改: # Copyright (c) 2024 Alibaba PAI and Nvidia Megatron-LM Team. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License a…

Linux——多路复用之select

目录 前言 一、select的认识 二、select的接口 三、select的使用 四、select的优缺点 前言 在前面,我们学习了五种IO模型,对IO有了基本的认识,知道了select效率很高,可以等待多个文件描述符,那他是如何等待的呢&a…

JavaScript 获取 url(get)参数

https://andi.cn/page/621584.html

Gitee 使用教程1-SSH 公钥设置

一、生成 SSH 公钥 1、打开终端(Windows PowerShell 或 Git Bash),通过命令 ssh-keygen 生成 SSH Key: ssh-keygen -t ed25519 -C "Gitee SSH Key" 随后摁三次回车键(Enter) 2、查看生成的 SSH…

大鲸鱼docker-compose单机容器集群编排工具

目录 一、Docker-compose 概述 二、Docker-compose简介 三、YML文件格式及编写注意事项 1.yml文件是什么 2.yml问价使用注意事项 3.yml文件的基本数据结构 四、Docker-compose 配置 1.Docker-Compose 配置常用字段 2.Docker Compose常用命令 3.使用Docker-compose创建…

Python解释器:CPython 解释器

一、什么是python解释器 Python解释器是一种用于执行Python代码的程序。 它将Python源代码转换为机器语言或字节码,从而使计算机能够执行。 1.1 Python解释器分类 1、CPython CPython 是 Python 的主要实现,由 C 语言编写。大多数用户在日常开发中使…

django实现用户的注册、登录、注销功能

创建django项目的步骤:Django项目的创建步骤-CSDN博客 一、前置工作 配置数据库,设置数据库引擎为mysql 1、在settings文件中找到DATABASES, 配置以下内容 DATABASES {"default": {ENGINE: django.db.backends.mysql, # 数据库引擎NAME: dja…

色彩与故乡的对话 —— 钱华个人油画展正式开展

色彩与故乡的对话 —— 钱华个人油画展正式开展 2024年7月17日 ,在宁波这座历史与现代交织的城市里,艺术与文化的碰撞再次绽放出耀眼的光芒。由宁波海曙区美术家协会主办,宁波市海纳广场开发经营有限公司协办的“色彩与故乡的对话——钱华个人…

【SpringBoot Web开发之静态资源访问】笔记

详细内容见官方文档:Static Content SpringBoot Web开发之静态资源访问 1.准备工作:创建WebDemo2.静态资源目录2.1官网原文2.2静态资源目录第一步:依照上面2.1官网原文中创建如下目录第二步:复制粘贴图片到静态资源目录中第三步…

二叉树的前、中、后序遍历(递归法、迭代法)leetcode144/94/145

leetcode144、二叉树的前序遍历 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3] 示例 2: 输入:root [] 输出:[] 示例 3:…

海外媒体发稿-瑞典SEO破茧成蝶:从0到10的实战精要-大舍传媒

海外媒体发稿-瑞典SEO破茧成蝶:从0到10的实战精要 一、迷茫与意义的探寻 有一天我找了王老师聊天,谈到生活迷茫和人生的意义。老师说了一段话:当全情投入于一件事情时,是没有时间去迷茫或思索人生意义的。我感触很深,当总感到迷…

UI设计中的响应式布局策略:让您的界面在各种设备上都表现出色

UI界面设计它是人与机器之间交互的媒介,也是客户体验的媒介(UX)一个组成部分。操作界面由两个主要部分组成:视觉设计(即传达产品的外观和感觉)和交互设计(即元素功能和逻辑组织)。用…

自定义注解 + Redis 实现业务的幂等性

1.实现幂等性思路 实现幂等性有两种方式: ⭐ 1. 在数据库层面进行幂等性处理(数据库添加唯一约束). 例如:新增用户幂等性处理,username 字段可以添加唯一约束. ⭐ 2. 在应用程序层面进行幂等性处理. 而在应用程序…

Go语言并发编程-Channel通信_2

Channel通信 Channel概述 不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存 这是Go语言最核心的设计模式之一。 在很多主流的编程语言中,多个线程传递数据的方式一般都是共享内存,而Go语言中多Goroutine通信的主要方案是Cha…

人工智能算法工程师(高级)课程1-单类目标识别之人脸检测识别技术MTCNN模型介绍与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(高级)课程1-单类目标识别之人脸检测识别技术MTCNN模型介绍与代码详解。本文深入探讨了基于PyTorch的人脸检测与识别技术,详细介绍了MTCNN模型、Siamese network以及center loss、sof…

趣谈linux操作系统 9 网络系统-读书笔记

文章目录 网络协议栈基础知识回顾网络分层网络分层的目的各层作用简介延伸-ip地址,有类,无类,cidr socket实现分析tcp/udp回顾socket编程回顾TCP编程回顾UDP编程回顾差异 socket相关接口实现浅析sokcet实现解析创建socket的三个参数socket函数定义及其参数创建socket结构体关联…

element UI :el-table横向列内容超出宽度,滚动条不显示问题

是否能解决你问题的前提 **看到这篇文章的解决问题的方案之前,请先回忆你是否在项目中的全局样式或者私有组件中去单独设置过滚动条样式。如果有 请继续往下看:**单独设置过滚动条样式代码实例: ::-webkit-scrollbar {/*滚动条整体样式*/wi…