redis的发布订阅功能

简介

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息 发布的消息没有持久化,如果在订阅的客户端收不到hello,只能收到订阅后发布的消息

redis客户端实现

订阅

subcribe 主题名字

subscribe jkw

发布【返回的是订阅者数量】

publish jkw hello

效果

redis的发布订阅功能_第1张图片

java实现

项目搭建

pom.xml



    4.0.0

    
        org.springframework.boot
        spring-boot-starter-parent
        2.7.8
        
    

    jkw.life
    redis-learn
    0.0.1

    
        
        
            org.springframework.boot
            spring-boot-starter-data-redis
        
        
        
            org.projectlombok
            lombok
            true
        
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            org.springframework.boot
            spring-boot-starter
        
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    


application.yml

server:
  port: 8080
spring:
  redis:
    # 数据库索引 默认为0
    #database: 1
    host: 192.168.66.102
    port: 6379
    #连接超时时间(毫秒)
    timeout: 30000
   
    jedis:
      pool:
        #连接池最大连接数(使用负值表示没有限制)
        max-active: 8
        #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1
        #连接池中的最大空闲连接
        max-idle: 8
        #连接池中的最小空闲连接
        min-idle: 0

启动类

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

编写监听器

监听类
package jkw.subcribeDemo;


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

/**
 * 监听类
 */
@Component
public class CatListener implements MessageListener {
    @Override
    public void onMessage(Message message, byte[] bytes) {
        System.out.println("我是订阅者,今天的消息是 " + message.toString());
    }
}
消息监听容器
package jkw.subcribeDemo;

import org.springframework.cache.annotation.CachingConfigurerSupport;
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 CatListenerConfig extends CachingConfigurerSupport {
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory factory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(factory);
        //订阅一个通道 该处的通道名是发布消息时的主题名字
        container.addMessageListener(catAdapter(), new PatternTopic("jkw"));
        return container;
    }
    @Bean//绑定消息处理器
    MessageListenerAdapter catAdapter() {
        return new MessageListenerAdapter(new CatListener());
    }
}

测试及效果

测试类

package jkw;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

@SpringBootTest
public class TestRedis {
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    public void add(){
        redisTemplate.convertAndSend("jkw","发送的第一条消息");
    }
}

效果

redis的发布订阅功能_第2张图片

你可能感兴趣的:(数据库,redis,缓存,数据库)