SpringBoot+Redis实现消息的发布与订阅的示例代码
作者:逆着黑夜便是光
本文主要介绍了SpringBoot+Redis实现消息的发布与订阅,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
1.什么是redis的发布与订阅
在官网的文档介绍中有一行介绍:Redis是一个快速稳定的发布/订阅消息系统。
2.Redis发布订阅
Redis提供了发布与订阅的功能,可以用于消息的传输,Redis的发布订阅机制包括三部分,发布者、订阅者和Channel(主题或者队列)。
3.命令行实现功能
Redis采用SUBSCRIBE channel命令订阅某个主题,返回的参数subscribe表示已经成功订阅主题,第二个参数表示订阅的主题名称,第三个表示当前订阅数
127.0.0.1:6379> SUBSCRIBE ORDER-PAY-SUCCESS
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "ORDER-PAY-SUCCESS"
3) (integer) 1
模式匹配订阅
模式匹配功能是允许客户端订阅匹配某种模式的频道,Redis采用PSUBSCRIBE channel命令订阅匹配某种模式的所有频道,用*表示模式,*可以被任意值代替。
127.0.0.1:6379> PSUBSCRIBE ORDER-PAY-*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "ORDER-PAY-*"
3) (integer) 1
Redis采用PUBLISH channel message命令在某个主题上发布消息,返回的参数是接收到消息的订阅者个数
127.0.0.1:6379> PUBLISH ORDER-PAY-SUCCESS DD202109071525
(integer) 1
Redis采用UNSUBSCRIBE channel或PUNSUBSCRIBE channel命令取消某个主题的订阅,由于Redis的订阅操作是阻塞式的,因此一旦客户端订阅了某个频道或模式,就将会一直处于订阅状态直到退出。在 SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE 和 PUNSUBSCRIBE 命令中,其返回值都包含了该客户端当前订阅的频道和模式的数量,当这个数量变为0时,该客户端会自动退出订阅状态。
127.0.0.1:6379> UNSUBSCRIBE ORDER-PAY-SUCCESS
1) "unsubscribe"
2) "ORDER-PAY-SUCCESS"
3) (integer) 0
127.0.0.1:6379> PUNSUBSCRIBE ORDER-PAY-SUCCESS
1) "punsubscribe"
2) "ORDER-PAY-SUCCESS"
3) (integer) 0
首先三个订阅者订阅ORDER-PAY-SUCCESS主题,当发送者在这个主题内发送订单号时,所有的订阅者都会收到这个主题的消息。
4.SpringBoot实现功能
Springboot整合Redis
引入依赖包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.4.1</version>
</dependency>
</dependencies>
配置yaml文件
server:
port: 8888
spring:
application:
name: spring-boot-redis
redis:
host: 127.0.0.1
port: 6379
配置消息监听
import com.demo.redis.listener.MessageListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
* @author Bai
* @date 2021/4/29 上午 11:17
* @description
@Configuration
public class RedisMessageConfig {
* 监听订单支付完成主题
private static final String ORDER_PAY_SUCCESS = "ORDER-PAY-SUCCESS";
* 注入消息监听适配器
* @param messageListener
* @return {@link MessageListenerAdapter}
* @throws
* @author Bai
* @date 2021/9/7 下午 03:54
@Bean
public MessageListenerAdapter getMessageListenerAdapter(MessageListener messageListener){
return new MessageListenerAdapter(messageListener, "onMessage");
* 注入消息监听容器
* @param redisConnectionFactory
* @param messageListenerAdapter
* @return {@link RedisMessageListenerContainer}
* @throws
* @author Bai
* @date 2021/9/7 下午 03:54
@Bean
public RedisMessageListenerContainer getRedisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory, MessageListenerAdapter messageListenerAdapter){
RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
//订阅订单支付成功主题
redisMessageListenerContainer.addMessageListener(messageListenerAdapter, new PatternTopic(ORDER_PAY_SUCCESS));
return redisMessageListenerContainer;
* 处理内容
* @param connectionFactory
* @return {@link StringRedisTemplate}
* @throws
* @author Bai
* @date 2021/9/7 下午 04:01
@Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
import org.springframework.stereotype.Component;
* @author Bai
* @date 2021/9/7 下午 03:51
* @description
@Component
public class MessageListener {
public void onMessage(String message){
System.out.println("接收消息:" + message);
发送订单支付成功的消息