Redis 2.8 及以上版本实现了发布订阅的功能,发送者可以通过 PUBLISH发布消息,订阅者通过 SUBSCRIBE 订阅接收消息或通过UNSUBSCRIBE 取消订阅。当发布者发布消息到指定频道时,所有订阅该频道的订阅者都能够接收到消息。这对于实时通信、聊天应用、实时数据更新等场景非常有用。
下面我就在Spring Boot项目中使用Redisson 来实现发布订阅
1、添加redisson依赖,依赖如下
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.16.8</version>
</dependency>
2、创建Redisson客户端
我们需要创建一个Redisson客户端实例来使用Redisson,一般通过在Spring Boot配置文件中添加Redisson客户端的配置来创建它
下面是一个简单的配置示例
@Configuration
public class RedissonConfig {
@Value("${redisson.address}")
private String address;
@Bean(destroyMethod="shutdown")
RedissonClient redisson() throws IOException {
Config config = new Config();
config.useSingleServer().setAddress(address);
return Redisson.create(config);
}
}
3、创建发布者
接下来,您需要创建一个发布者类,用于向指定的频道发布消息。您可以使用Redisson客户端的getTopic方法获取指定的频道,并使用publish方法发布消息。例如:
@Service
public class Publisher {
@Autowired
private RedissonClient redissonClient;
/**
* 发布消息到 Topic
* @param topicName Topic名称
* @param message 消息体
*/
public void publish(String topicName, String message) {
RTopic topic = redissonClient.getTopic(topicName);
topic.publish(message);
}
}
4、创建消息监听器类
为了定义接收到消息后的处理逻辑,还需要创建一个消息监听器接口(MessageListener)的实现类,实现onMessage方法来定义我们的消息处理逻辑
@Slf4j
@Component
public class MyMessageListener implements org.redisson.api.listener.MessageListener<String> {
/**
* 消息处理
* @param channel
* @param msg
*/
@Override
public void onMessage(CharSequence channel, String msg) {
log.info("监听到消息:"+msg);
}
}
5、创建订阅者
最后,您需要创建一个订阅者类,用于订阅指定的频道并处理接收到的消息。您可以使用Redisson客户端的getTopic方法获取指定的频道,并使用addListener方法添加消息监听器。例如:
@Slf4j
@Component
public class Subscriber{
/**
* 主题名称
*/
public static final String TOPIC_NAME = "test_topic";
@Autowired
private RedissonClient redissonClient;
@Autowired
private MyMessageListener myMessageListener;
/**
* 订阅主题
*/
@PostConstruct
public void init() {
redissonClient.getTopic(TOPIC_NAME)
.addListener(String.class, myMessageListener);
}
/**
* 订阅主题
* @param topicName 主题名
* @param type 消息类型
* @param listener 监听器
*/
public void subscribeTopic(String topicName, Class type, MessageListener listener) {
RTopic topic = redissonClient.getTopic(topicName);
topic.addListener(type,listener);
}
}
@PostConstruct 是Java中的一个注解,用于标记在依赖注入完成后,应该执行的方法。这个注解通常用于在Spring或Java EE环境中,当一个bean被初始化并完成依赖注入后,执行一些初始化的操作。
这里是在初始化的时候先订阅一些我们需要使用的主题