springboot整合redis发布订阅(4步搞定)

springboot整合redis系列集合

  • 1.springboot整合redis序列化(3步搞定)
  • 2.springboot整合redis发布订阅(4步搞定)
  • 3.springboot整合redis数据结构对应使用场景讲解
  • 4.springboot整合redis分布式锁

springboot整合redis发布订阅(4步搞定)

  • 项目结构图
  • 1、pom文件添加依赖
  • 2、yml文件配置连接
  • 3、添加监听者
    • 添加监听者1号
    • 添加监听者2号
  • 4、添加配置类(序列化、建立监听与频道绑定关系)
  • 进行测试
    • 添加一个DemoPubController
    • 运行项目,Postman调用测试
      • 发布消息
      • 监听器接收到了消息
  • 总结


项目结构图

springboot整合redis发布订阅(4步搞定)_第1张图片

1、pom文件添加依赖

1.依赖版本springboot会自动匹配,所以不用关注
2.fastjson依赖方便我们管理json格式数据

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
   <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.72</version>
</dependency>

2、yml文件配置连接

redis安装教程请移步查看: docker快速安装redis(两步轻松搞定)

port:端口号
host:ip地址
password:密码

spring:
  redis:
    port: 6379
    host: 127.0.0.1
    password: 123456

3、添加监听者

添加监听者1号

package com.phy.demo.listen;

import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;

/**
 * redis 监听器/订阅者 编号1
 * @author phy
 * @since 2021-09-29
 */
public class ConsumerRedisOneListener implements MessageListener {
    @Override
    public void onMessage(Message message, byte[] bytes) {
        System.err.println("订阅者-1号,接收到消息:"+new String(message.getBody()));
    }
}

添加监听者2号

package com.phy.demo.listen;

import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;

/**
 * redis 监听器/订阅者 编号2
 * @author phy
 * @since 2021-09-29
 */
public class ConsumerRedisTwoListener implements MessageListener {
    @Override
    public void onMessage(Message message, byte[] bytes) {
        System.err.println("订阅者-2号,接收到消息:"+new String(message.getBody()));
    }
}

4、添加配置类(序列化、建立监听与频道绑定关系)

package com.phy.demo.config;

import com.phy.demo.listen.ConsumerRedisOneListener;
import com.phy.demo.listen.ConsumerRedisTwoListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * redis 序列化 & 发布频道 & 监听器配置
 * @author phy
 */
@Configuration
public class RedisConfig {
    /** 配置类中注入连接工厂 */
    @Autowired
    private LettuceConnectionFactory connectionFactory;

    /** 创建监听器/订阅者 1号 */
    @Bean
    public ConsumerRedisOneListener consumeRedisOneListener() {
        return new ConsumerRedisOneListener();
    }
    /** 创建监听器/订阅者 2号 */
    @Bean
    public ConsumerRedisTwoListener consumeRedisTwoListener() {
        return new ConsumerRedisTwoListener();
    }
    /** 创建频道 */
    @Bean
    public ChannelTopic channelCore() {
        return new ChannelTopic("channelCore");
    }
    /** 建立频道与监听器绑定关系 */
    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer() {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        // 频道绑定监听器1号
        container.addMessageListener(consumeRedisOneListener(), channelCore());
        // 频道绑定监听器2号
        container.addMessageListener(consumeRedisTwoListener(), channelCore());
        return container;
    }
    /**
     * redis序列化配置 否则会乱码
     * @param connectionFactory 连接工厂
     * @return
     */
    @Bean
    public RedisTemplate redisTemplate(LettuceConnectionFactory connectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(connectionFactory);
        // 替换默认序列化
        GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

至此,springboot整合redis发布订阅/消息队列就已完成,下面我们测试一下


进行测试

添加一个DemoPubController

package com.phy.demo.controller;

import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

/**
 * demo redis 发布者 前端控制器
 * @author phy
 * @since 2021-09-29
 */
@RestController
@RequestMapping("/pub")
public class DemoPubController {
    @Autowired
    private RedisTemplate redisTemplate;

    @PostMapping("send")
    public void set(@RequestBody JSONObject json) {
        redisTemplate.convertAndSend("channelCore",json.get("data"));
    }
}

运行项目,Postman调用测试

发布消息

springboot整合redis发布订阅(4步搞定)_第2张图片

监听器接收到了消息

springboot整合redis发布订阅(4步搞定)_第3张图片

总结

发布者与监听者,可以是跨项目、跨服务的。引入redis发布/订阅可以解耦
渠道与监听器绑定关系可以是一对多,也可以是多对一,还可以是多对多。根据实际需求设置

你可能感兴趣的:(redis,java)