springboot2 redis订阅和发布 消息推送

简介

Redis(Remote Dictionary Server)是一个基于键值对的内存数据库,它提供了高度可扩展性和性能,常用于缓存、队列、消息中间件等场景。在分布式系统中,消息推送是非常常见的一种需求,通过Redis的发布-订阅机制可以很方便地实现消息的发布和订阅。

本文将介绍如何在Spring Boot2中使用Redis实现消息推送的功能,具体涉及以下内容:

  1. 构建Spring Boot2项目
  2. 集成Redis依赖
  3. 发布消息
  4. 订阅消息
  5. 完整示例代码

构建Spring Boot2项目

首先,我们需要构建一个基于Spring Boot2的项目。在构建过程中,可以选择使用Maven或者Gradle来管理依赖。

pom.xml(如果使用Maven)或者build.gradle(如果使用Gradle)文件中,添加Spring Boot2和Redis的相关依赖:

Maven依赖配置

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>    
</dependencies>

Gradle依赖配置

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
}

集成Redis依赖

在Spring Boot2中,集成Redis非常简单。只需要在配置文件中添加Redis的连接信息即可。

application.properties或者application.yml文件中,添加以下配置信息:

spring.redis.host=your_redis_host
spring.redis.port=your_redis_port

发布消息

在Spring Boot2中,可以通过RedisTemplate来进行Redis操作。首先,我们需要在Spring Boot的配置类中配置RedisTemplate,并注入到需要发布消息的类中。

@Configuration
public class RedisConfig {

    @Autowired
    private RedisConnectionFactory connectionFactory;

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        template.setDefaultSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        return template;
    }
}

在需要发布消息的类中,注入RedisTemplate,并使用convertAndSend方法进行消息的发布。

@Service
public class MessagePublisher {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void publish(String channel, Object message) {
        redisTemplate.convertAndSend(channel, message);
    }
}

订阅消息

与发布消息相对应,我们需要在Spring Boot的配置类中配置MessageListener,并注入到需要订阅消息的类中。

@Configuration
public class RedisConfig {

    @Autowired
    private RedisConnectionFactory connectionFactory;

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer() {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }

    @Bean
    public MessageListenerAdapter messageListenerAdapter() {
        return new MessageListenerAdapter(new MessageSubscriber());
    }
}

在需要订阅消息的类中,创建一个继承自MessageListener的类,并重写onMessage方法来处理接收到的消息。

public class MessageSubscriber implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] pattern) {
        String channel = new String(message.getChannel());
        String content = new String(message.getBody());
        System.out.println("Received message: " + content + " from channel: " + channel);
    }
}

完整示例代码

@Configuration
public class RedisConfig {

    @Autowired
    private RedisConnectionFactory connectionFactory;

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        template.setDefaultSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        return template;
    }

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer() {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }

    @Bean
    public MessageListenerAdapter messageListenerAdapter() {
        return new MessageListenerAdapter(new MessageSubscriber());
    }
}

@Service
public class MessagePublisher {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void publish(String channel, Object message) {
        redisTemplate.convert