在 Spring Boot 中实现 Redis 的发布/订阅功能可以通过 RedisTemplate 和消息监听器来完成

简介: 在 Spring Boot 中实现 Redis 的发布/订阅功能可以通过 RedisTemplate 和消息监听器来完成

在 Spring Boot 中实现 Redis 的发布/订阅功能可以通过 RedisTemplate 和消息监听器来完成。发布/订阅模式允许多个客户端同时订阅一个频道,并且当有消息发布到该频道时,所有订阅了该频道的客户端都能接收到消息。

 

### 步骤概述

 

1. **添加依赖**

2. **配置 Redis 连接**

3. **创建消息发布者**

4. **创建消息订阅者**

5. **测试发布和订阅**

 

### 1. 添加依赖

 

首先,在 `pom.xml` 文件中添加 Spring Boot Starter Redis 依赖:

```xml
    org.springframework.boot
    spring-boot-starter-data-redis
```

### 2. 配置 Redis 连接

 

在 `application.properties` 或 `application.yml` 中配置 Redis 连接信息:

```properties
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
```

### 3. 创建消息发布者

 

创建一个发布者类,用于向指定的频道发布消息:

```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
 
@Component
public class RedisMessagePublisher {
 
    @Autowired
    private RedisTemplate redisTemplate;
 
    public void publish(String channel, String message) {
        redisTemplate.convertAndSend(channel, message);
        System.out.println("Message published to Redis channel [" + channel + "]: " + message);
    }
}
```

### 4. 创建消息订阅者

 

创建一个订阅者类,用于监听指定的频道并处理接收到的消息:

 

```java
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.stereotype.Component;
 
@Component
public class RedisMessageSubscriber implements MessageListener {
 
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String channel = new String(message.getChannel());
        String msg = new String(message.getBody());
        System.out.println("Message received from Redis channel [" + channel + "]: " + msg);
        // 在这里处理接收到的消息逻辑
    }
}
```

### 5. 配置消息监听器

 

在 Spring Boot 配置类中配置 Redis 的消息监听器,并指定监听的频道:

```java
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.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
 
@Configuration
public class RedisConfig {
 
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                            MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listenerAdapter, new ChannelTopic("your-channel-name"));
        return container;
    }
 
    @Bean
    MessageListenerAdapter listenerAdapter(RedisMessageSubscriber subscriber) {
        return new MessageListenerAdapter(subscriber, "onMessage");
    }
}
```

### 测试发布和订阅

 

可以编写一个简单的测试类来测试发布和订阅功能:

```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
 
@Component
public class RedisTest implements CommandLineRunner {
 
    @Autowired
    private RedisMessagePublisher redisMessagePublisher;
 
    @Override
    public void run(String... args) {
        // 发布消息到指定频道
        redisMessagePublisher.publish("your-channel-name", "Hello, Redis!");
    }
}
```

在以上的示例中,当应用启动时,会自动发布一条消息到名为 "your-channel-name" 的 Redis 频道,并且配置的消息订阅者会接收并处理这条消息。

 

通过这种方式,我们就可以在 Spring Boot 应用中实现 Redis 的发布/订阅功能,实现异步消息传递和事件驱动的应用程序设计。

 

除了基本的发布/订阅功能外,还可以在实际应用中考虑一些额外的补充和注意事项:

 

### 1. **频道命名约定**

 

确保在使用频道名称时具有一致的命名约定,这可以帮助组织和管理多个频道,避免混淆和冲突。

 

### 2. **消息序列化**

 

默认情况下,RedisTemplate 使用 Java 的序列化机制来序列化对象。可以考虑使用 JSON 序列化或其他更轻量级的序列化方式,以提高性能和减少存储空间。

 

### 3. **异常处理**

 

在消息发布和订阅过程中,需要考虑到可能的异常情况,如网络故障或Redis服务不可用。合理的异常处理可以增强系统的可靠性和稳定性。

 

### 4. **消息确认机制**

 

Redis 的发布/订阅模式本身不提供消息确认机制,即发布者无法确认哪些订阅者接收了消息。如果需要确认机制,可以考虑使用消息队列(如Redis List)或其他适合的解决方案。

 

### 5. **性能优化**

 

在高并发场景下,考虑使用 Redis 的集群或主从复制机制来提高性能和可伸缩性。此外,可以通过合理的配置和优化,如连接池设置、线程池管理等来优化 Redis 的使用。

 

### 6. **安全性**

 

确保 Redis 的访问权限和安全设置是适当的,尤其是在生产环境中。使用密码保护和限制访问权限可以有效防止未授权的访问和数据泄露。

 

### 7. **监控和日志**

 

为了及时发现和解决问题,建议实现监控和日志记录机制,监控 Redis 的状态和性能指标,并记录关键操作和异常情况。

 

目录
相关文章
|
10月前
|
NoSQL Java 网络安全
SpringBoot启动时连接Redis报错:ERR This instance has cluster support disabled - 如何解决?
通过以上步骤一般可以解决由于配置不匹配造成的连接错误。在调试问题时,一定要确保服务端和客户端的Redis配置保持同步一致。这能够确保SpringBoot应用顺利连接到正确配置的Redis服务,无论是单机模式还是集群模式。
742 5
|
10月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
790 2
|
11月前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
886 0
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
|
存储 NoSQL Redis
采用Redis的Bitmaps实现类似Github连续提交状态的功能。
在现实世界的应用开发中,实现类似于Github提交跟踪系统时,还可能需要考虑用户时区、闰年等日期相关的边界条件,以及辅助数据的存储和查询优化,例如对活跃用户的即时查询和统计等。不过这些都可以在Bitmaps的基础功能之上通过额外的代码逻辑来实现。
253 0
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
854 2
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
2730 0
|
机器学习/深度学习 数据采集 人机交互
springboot+redis互联网医院智能导诊系统源码,基于医疗大模型、知识图谱、人机交互方式实现
智能导诊系统基于医疗大模型、知识图谱与人机交互技术,解决患者“知症不知病”“挂错号”等问题。通过多模态交互(语音、文字、图片等)收集病情信息,结合医学知识图谱和深度推理,实现精准的科室推荐和分级诊疗引导。系统支持基于规则模板和数据模型两种开发原理:前者依赖人工设定症状-科室规则,后者通过机器学习或深度学习分析问诊数据。其特点包括快速病情收集、智能病症关联推理、最佳就医推荐、分级导流以及与院内平台联动,提升患者就诊效率和服务体验。技术架构采用 SpringBoot+Redis+MyBatis Plus+MySQL+RocketMQ,确保高效稳定运行。
937 0
|
XML 搜索推荐 Java
Spring源码 --- 监听器的原理 (下)
Spring源码 --- 监听器的原理 (下)
270 0
Spring源码 --- 监听器的原理 (下)
|
设计模式 Java Nacos
Spring源码 --- 监听器的原理 (上)
Spring源码 --- 监听器的原理
582 0
Spring源码 --- 监听器的原理 (上)