简介
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息 发布的消息没有持久化,如果在订阅的客户端收不到hello,只能收到订阅后发布的消息
redis客户端实现
订阅
subcribe 主题名字
subscribe jkw
发布【返回的是订阅者数量】
publish jkw hello
效果
编辑
编辑
java实现
项目搭建
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.8</version> <relativePath/> </parent> <groupId>jkw.life</groupId> <artifactId>redis-learn</artifactId> <version>0.0.1</version> <dependencies> <!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--springMVC--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--springBoot起步依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!--test--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
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","发送的第一条消息"); } }
效果
编辑