Redis客户端的发布订阅
Redis提供了发布订阅(pub/sub)的消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息
发布订阅是客户端进行的,与数据库无关,一个客户端可以订阅多个频道(channel),一个频道可以被多个客户端订阅
- 订阅:
subscribe channel[channel...]
订阅一个或多个频道
psubscribe pattern[pattern...]
订阅一个或多个符合给定模式的频道,每个模式以 * 作为匹配符,比如 it* 匹配所有名字以it开头的频道
订阅后,客户端为阻塞状态,等待发布者发布信息
- 发布
publish channel message
将消息发送到指定频道
发送消息后,返回值为订阅该频道的客户端数
客户端接收到信息
- 退订
unsubscribe channel[channel...]
退订指定的频道
punsubscrib pattern[pattern...]
退订所有给定模式的频道
Springboot实现发布订阅
使用Lettuce客户端:SpringBoot - 整合Redis:解析Lettuce与RedisTemplate封装
项目有四个部分:
- 配置类RedisConfig:RedisTemplate、监听器的配置
- 工具类RedisReceiver:订阅者接收信息后的处理方法
- application.yml:连接Redis
- PubsubApplicationTests:测试类
RedisReceiver
接收通道信息后的业务:这里仅控制台输出
package com.redis.pubsub.util;
import org.springframework.stereotype.Component;
/**
* Author : zfk
* Data : 11:40
*/
@Component
public class RedisReceiver {
//收到通道的消息后执行的监听方法:要和Config中MessageListenerAdapter对应
public void receiveMessage(String message){
System.out.println(message);
}
}
RedisConfig
配置类向Spring容器注入了3个bean:
- RedisTemplate封装Lettuce
package com.redis.pubsub.config;
import com.redis.pubsub.util.RedisReceiver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
/**
* Author : zfk
* Data : 11:43
*/
@Configuration
public class RedisConfig {
//序列化格式
@Bean
public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory factory){
RedisTemplate<String,Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
return template;
}
//监听器容器
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,MessageListenerAdapter listenerAdapter){
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//容器可以添加多个MessageListenerAdapter,也就是监听多个通道
container.addMessageListener(listenerAdapter,new PatternTopic("Test"));
return container;
}
/**
* 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
* @param receiver
* @return
*/
@Bean
MessageListenerAdapter listenerAdapter(RedisReceiver receiver) {
System.out.println("消息适配器1");
return new MessageListenerAdapter(receiver, "receiveMessage");
}
}
application.yml
连接Redis的配置,yml语法(使用application.properties也可以)
spring:
redis:
host: ip地址
password: 密码
port: 6379
lettuce:
pool:
max-active: 8
max-idle: 8
min-idle: 2
max-wait: 1000
timeout: 10000
PubsubApplicationTests
测试类:注入RedisTemplate,当前线程每两秒发送一次信息
package com.redis.pubsub;
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;
import java.util.Date;
@SpringBootTest
class PubsubApplicationTests {
@Autowired
private RedisTemplate<String,Object> template;
@Test
void contextLoads() {
for (int i = 0;i < 5;i++){
try {
Thread.sleep(2000);
}
catch (Exception e){
e.getMessage();
}
template.convertAndSend("Test",String.format("我是消息{%d}号: %tT", i, new Date()));
}
}
}
测试结果:
代码
我的码云,有兴趣可以查看