springboot 整合Redis实现发布/订阅功能

news/2025/9/22 22:14:46/文章来源:https://www.cnblogs.com/2678066103hs/p/19106187

Redis发布/订阅模式简介

  1. 什么是发布/订阅?

    发布/订阅是一种消息通信模式,其中发送者(发布者)发布消息,多个接收者(订阅者)订阅并接收消息。发布者和订阅者之间没有直接联系,消息由消息中间件(如Redis)传递。

    在这里插入图片描述

  2. Redis 发布/定义的优点

    • 高性能:Redis作为内存存储,具备极高的读写性能,能够快速处理发布和订阅消息
    • 简单易用:Redis的发布/订阅接口简单,易于集成和使用
    • 实时性强:发布的消息会立即传递给所有订阅者,具备高实时性
  3. Redis发布/订阅的缺点

    • 消息丢失:由于Redis是内存存储,如果Redis实例宕机,未处理的消息可能会丢失
    • 无法持久化:Redis的发布/订阅模式不支持消息持久化,无法存储和检索历史消息
    • 订阅者不可控:发布者无法控制订阅者的数量和状态,无法保证所有订阅者都能收到消息
    • 无确认机制:发布者无法确认消息是否被订阅者接收和处理

    正如上述中Redis的缺点,Redis 的发布订阅功能并不可靠,如果我们需要保证消息的可靠性、包括确认、重试等要求,我们还是要选择MQ实现发布订阅

    Redis的发布/订阅应用场景:

    对于消息处理可靠性要求不强
    消息无需持久化
    消费能力无需通过增加消费方进行增强
    架构简单 中小型系统不希望应用过多中间件

  4. redis 发布订阅命令

    命令 描述
    Redis Unsubscribe 命令 指退订给定的频道
    Redis Subscribe 命令 订阅给定的一个或多个频道的信息
    Redis Pubsub 命令 查看订阅与发布系统状态
    Redis Punsubscribe 命令 退订所有给定模式的频道
    Redis Publish 命令 将信息发送到指定的频道
    Redis Psubscribe 命令 订阅一个或多个符合给定模式的频道

演示

  1. 添加依赖

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
    </dependency>
    
  2. 配置Redis

    spring:#redisredis:# 地址host: 127.0.0.1# 端口,默认为6379port: 6379# 数据库索引database: 0# 密码password:# 连接超时时间timeout: 10slettuce:pool:# 连接池中的最小空闲连接min-idle: 5# 连接池中的最大空闲连接max-idle: 8# 连接池的最大数据库连接数max-active: 20# #连接池最大阻塞等待时间(使用负值表示没有限制)max-wait: -1ms
    
  3. 创建Redis配置类

    package com.example.demo.config;import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.listener.PatternTopic;
    import org.springframework.data.redis.listener.RedisMessageListenerContainer;
    import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;@Configuration
    public class RedisConfig {@BeanRedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,MessageListenerAdapter listenerAdapter) {//设置连接工厂RedisConnectionFactoryRedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);// 订阅订阅名称 micro 的通道container.addMessageListener(listenerAdapter, new ChannelTopic("micro"));// 订阅名称 'test-' 开头的全部通道container.addMessageListener(listenerAdapter, new PatternTopic("test-*"));return container;}@Beanpublic MessageListenerAdapter listenerAdapter(MessageReceiver receiver) {return new MessageListenerAdapter(receiver);}
    }
    
  4. 创建消息接收/发布类

    创建一个消息发布类,用于发布消息

    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.stereotype.Component;@Component
    public class MessagePublisher {private final StringRedisTemplate redisTemplate;public MessagePublisher(StringRedisTemplate redisTemplate) {this.redisTemplate = redisTemplate;}public void publish(String channel, String message) {redisTemplate.convertAndSend(channel, message);}
    }
    

    创建一个消息接收类,用于处理接收到的消息

    import lombok.extern.slf4j.Slf4j;
    import org.springframework.data.redis.connection.Message;
    import org.springframework.data.redis.connection.MessageListener;
    import org.springframework.stereotype.Component;@Component
    @Slf4j
    public class MessageReceiver implements MessageListener {@Overridepublic void onMessage(Message message, byte[] pattern) {//消息通道String channel = new String(message.getChannel());//消息内容String messageBody = new String(message.getBody());// 消息订阅的匹配规则,如 new PatternTopic("test-*") 中的 test-*String msgPattern = new String(pattern);log.info("接收消息: channel={} body={} pattern={} ", channel, messageBody, msgPattern);// 这里处理接收的消息}
    }
    
  5. 编写controller测试

    创建一个简单的控制,来测试发布订阅功能

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;@RestController
    @RequestMapping("/api")
    public class PublisherController {@Autowiredprivate MessagePublisher messagePublisher;@GetMapping("/publish")public String publish(@RequestParam String message) {messagePublisher.publish("micro", message);return "Message published: " + message;}
    }
    

通过本文,我们详细介绍了如何在 Spring Boot 中整合 Redis 实现发布/订阅功能,并提供了详细的代码示例。Redis 发布/订阅模式以其高性能和简单易用的特点,在实时消息传递场景中有着广泛的应用,但同时就如文中提到的小伙伴们也需要注意其消息丢失和无法持久化等缺点,需要根据实际业务需求选择。

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

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

相关文章

网站年龄和域名年龄wordpress删除分类目录

香甜的黄油 Sweet Butter luogu 1828 题目大意&#xff1a; 有n头奶牛&#xff0c;他们在不同的牧场中&#xff0c;他们之间有一些路&#xff0c;现在要让他们去一个地方吃黄油&#xff0c;使他们的总距离最小 题目描述 农夫John发现做出全威斯康辛州最甜的黄油的方法&…

在线购物的网站制作太原网站建设费用

http://home.cnblogs.com/blog/转载于:https://www.cnblogs.com/yanyanhappy/archive/2012/09/07/2675050.html

律师事务所网站案例想学企业管理课程

找了很多&#xff0c;但是都不太好用&#xff0c;打算自己总结一个保姆级教学&#xff0c;无需动脑&#xff0c;电脑有电就能实现 在HTML部分&#xff0c;我们需要一个标签来放置图片 <template><div><img :src"imageSrc" alt"未获取到图片&qu…

个人游戏网站备案优化seo可以从以下几个方面进行

今天开始跟着网友大佬学习cartographer. 1. 如何保存cartographer的地图数据 在运行cartographer过程中可以随时保存建好的地图&#xff0c;步骤如下&#xff1a; 首先是重新打开一个terminal, 如果你没有将你的cartographer_ros下的setup.bash文件写入到.bashrc中&#xff…

做教育app的网站有哪些内容外资企业

环境 操作系统 window server 2016 前端项目 Vue2 Nginx-1.25.3 一、错误信息 前端是vue项目&#xff0c;打包后部署在Nginx上&#xff0c;前端post请求出现Request Entity Too Large错误信息。 ​这种问题一般是请求实体太大&#xff08;包含参数&#xff0c;文件等&#xf…

网站开发安全需求桂林市天气预报15天

文章目录模拟测试测试返回结果实际应用创建Pipeline查看创建Pipeline新增数据测试查看新增数据创建索引时直接设置Pipeline模拟测试 测试 POST _ingest/pipeline/_simulate {"pipeline": {"processors": [{"set": {"field": "t…

怎么免费做个人网站云电脑免费版永久使用

前言 在当前多元化开发环境下&#xff0c;Java作为一种广泛应用的编程语言&#xff0c;其应用部署效率与灵活性的重要性日益凸显。Spring Boot框架以其简洁的配置和强大的功能深受开发者喜爱&#xff0c;而JavaFX则为开发者提供了构建丰富桌面客户端应用的能力。然而&#xff…

企业网站建设研究目的意义江西人才招聘网官网

背景&#xff1a; 最近做的一个项目中&#xff0c;对于word转Pdf用的地方很多&#xff0c;特此记录 搭建总图&#xff1a; 代码部分&#xff1a; 1.需要的jar包&#xff1a; aspose-words-15.8.0-jdk16.jar 注&#xff1a;下载好这个jar包后&#xff0c;在项目的根目录新建一…

网上商城网站模板网站导航栏效果

类似Oracle的客户端工具sqlplus&#xff0c;Mysql的客户端工具mysql&#xff0c;SinoDB数据库也有自带的命令行客户端工具dbaccess。 dbaccess 识别用户输入&#xff0c;将用户输入的 SQL 语句打包发送给 SinoDB 数据库服务器执行&#xff0c;然后接收服务器的执行结果&#xf…

CCPC online 2025题解 ( A~H+K)

没代码的就是队友写的,只提供思路 E 签到题,首先可以算出两人胜利的场次数,答案就是较小的那个*2+1 K 找规律题,打个表可以发现输出 \(n\) 到 \(1\) 即可 A 签到题,枚举每种正方形的边对应的向量,则能构成该种正…

Java REST API 三层架构项目目录规划与使用建议

Java REST API 三层架构项目目录规划与使用建议2025-09-22 22:07 曾左 阅读(0) 评论(0) 收藏 举报一. 背景介绍 当前,我们使用 Spring Boot + Mybatis + Maven 技术栈,按照微服务设计的要求(小而自治)开发 Jav…

典型的四大综合门户网站为食堂写个网站建设

From: http://www.51testing.com/html/44/17144-18146.html 1. 基本概念 实时传输协议&#xff08;RTP&#xff0c;Real-time Transport Protocol&#xff09;是用于Internet上针对多媒体数据流的一种传输协议。传送音视频数据通常都会采用基于UDP的RTP传输&#xff0c;RTP为数…

网站开发看什么书汕头seo专家

场景 NameNode迁移&#xff0c;导致一个节点无法启动 异常 在Namenode主动迁移&#xff0c;或者Namenode机器挂掉无法恢复时&#xff0c;我们需要Namenode节点迁移&#xff0c;迁移经常会出现一个NameNode启动成功&#xff0c;另外一个standby启动失败&#xff0c;报错如下 …

网站建设内链免费装修设计网

风丘科技将首次亮相 EVM ASIA 2023 WINDHILL will debut EVM ASIA 2023 ——可持续移动的未来 —The Future of SUSTAINABLE Mobility EVM ASIA 2023是亚太地区电气化的国际性展会&#xff0c;专注于新能源汽车、充电技术及汽车零件制造等。展会致力于促进包括充电站、交通…

网站内容建设 内容审核流程装修公司网站建设的意义

一、源码特点 asp.net特色商品购物网站系统 是一套完善的web设计管理系统&#xff0c;系统采用mvc模式&#xff08;BLLDALENTITY&#xff09;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 vs2010&#xff0c;数据库为sqlserver2008&a…

江苏扬州建设局网站网站建设制作好评语

淘宝/天猫获得淘宝商品详情 API 返回值说明 item_get-获得淘宝商品详情 API测试工具 taobao.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括…

国内有做外汇的正规网站吗关键词排名推广

java.util.concurrent.locks.Lock 接口是Java并发包中的一部分&#xff0c;它提供了比内置锁&#xff08;即 synchronized 关键字&#xff09;更灵活和强大的锁机制。通过使用 Lock 接口及其相关实现类&#xff0c;开发者可以获得更多的功能选项来控制线程间的同步行为&#xf…

如何选择网站开发公司做电影网站多少钱

前言 使用 API 网关作为内部服务面向客户端的单一入口&#xff0c;是一种普遍采用的架构模式。企业组织通过良好定义的 API 将内部系统向内部和外部用户公开&#xff0c;通常都会采用 API 网关来处理横向的关注点&#xff0c;包括访问控制、速率限制、负载均衡等等&#xff0c…

活动策划案怎么写网站优化排名易下拉技术

线程属于某一个进程 共同点&#xff1a;都能并发 线程共享变量&#xff0c;进程不共享。 多线程任务中&#xff0c;其中某一个线程调用了exit了&#xff0c;其他线程会跟着一起退出 如果是特定的线程就调用pthread_exit 失败返回的是错误号 下面也是

2025.9.22总结 - A

今天满课,上午是建模和数据结构,主要讲的还是基础,还有对UML的理解,下午Java,学到了,解决问题的,复杂问题简单化,简单问题流程化的思想,在解决问题时的分类转化思想,让问题更加简单,解决更加高效。