【Redis】浅谈Redis的发布(Push)和订阅(sub)

在日常开发中我们很多时候会用到发布/订阅这种模式,例如常用的一些消息中间件就会有这种模式,redis中也提供了这种模式,让我们来看下吧。

redis发布订阅(push/sub)是一种消息通信模式:发布者(push)发布消息,订阅者(sub)接收消息。

客户端可以订阅任意数量的频道。

1、发布订阅流程

1、客户端订阅消息频道

2、发布者将消息发布到频道

3、频道将消息发送给订阅的客户端

2、发布/订阅命令

2.1 订阅

订阅命令:subscribe/psubscribe

 

less

复制代码

//订阅一个活多个频道 subscribe channel1 channel2 ... //订阅一个或多个符合给定模式的频道,以"*"作为匹配符,如:it*则表示匹配以it开头的所有频道 psubscribe pattern [pattern ...]

2.2 发布

发布命令:publish

 

shell

复制代码

//将msg发送到指定的频道 publish channel1 msg

切换订阅窗口,可看到接收到的信息

3、SpringBoot实现redis发布订阅

SpringBoot是我们常用的开发框架,也会经常用到redis做各种数据的缓存,而redis的发布订阅也在日常开发中常用到。

3.1 引入redis包

 

xml

复制代码

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>

3.2 配置消息监听类

3.2.1 实现MessageListener接口

 

less

复制代码

/** * @author: jiangjs * @description: redis消息监听类 * @date: 2023/4/7 11:10 **/ @Slf4j @Component public class RedisMessageListener implements MessageListener { @Override public void onMessage(Message message, byte[] pattern) { byte[] body = message.getBody(); byte[] channel = message.getChannel(); log.info("------频道名称------:"+new String(channel)); log.info("------消息内容------:"+new String(body)); } }

redis的start类中提供的MessageListener接口中的onMessage方法可以接收到用户发布的信息,我们获取到信息后就可以编写自己的业务。

3.2.2 创建MessageListenerAdapter适配的类

 

typescript

复制代码

/** * @author: jiangjs * @description: * @date: 2023/4/7 14:32 **/ @Slf4j @Component public class MessageReceiver { public void receive(String message,String channel) { log.info("------频道名称------:"+ channel); log.info("------消息内容------:"+ message); } }

3.3 redis配置类,并监听渠道

配置文件配置订阅渠道信息:

 

yaml

复制代码

#redis订阅频道 redis: channel: jiashn,lovejiashn

3.3.1 监听MessageListener

 

typescript

复制代码

@Configuration public class RedisConfig { @Value("${redis.channel}") private String channel; @Bean public RedisMessageListenerContainer container(RedisConnectionFactory factory, RedisMessageListener listener){ List<String> channels = Arrays.asList(StringUtils.split(channel, ",")); List<ChannelTopic> topics = new ArrayList<>(channels.size()); channels.forEach(cha -> topics.add(new ChannelTopic(cha))); RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(factory); //订阅频道 container.addMessageListener(listener,topics); return container; } }

channel在配置文件中配置的渠道,创建container方法的参数中包含了第二步中的监听器,将监听器与频道进行绑定。RedisMessageListenerContainer redis消息监听容器可以将监听器与频道进行绑定,完成订阅频道。

3.3.2 监听MessageListenerAdpater

 

typescript

复制代码

/** * @author: jiangjs * @description: redis配置类 * @date: 2023/4/7 11:16 **/ @Configuration public class RedisConfig { @Value("${redis.channel}") private String channel; @Bean public MessageListenerAdapter adapter(MessageReceiver receiver){ return new MessageListenerAdapter(receiver, "receive"); } @Bean public RedisMessageListenerContainer container(RedisConnectionFactory factory, MessageListenerAdapter adapter){ List<String> channels = Arrays.asList(StringUtils.split(channel, ",")); List<ChannelTopic> topics = new ArrayList<>(channels.size()); channels.forEach(cha -> topics.add(new ChannelTopic(cha))); RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(factory); //订阅频道 container.addMessageListener(adapter,topics); return container; } }

在redis配置里面中创建MessageListenerAdapter,通过该构造函数创建时需要绑定监听类(如:MessageReceiver)及监听的方法(如:MessageReceiver中的receive方法),然后再通过RedisMessageListenerContainer进行频道订阅。

3.4 发布信息

 

less

复制代码

@Autowired private RedisTemplate<String,String> template; @GetMapping("/send/{channel}/{msg}") public ResultUtil<String> sendMessage(@PathVariable("channel") String channel, @PathVariable("msg") String msg){ template.convertAndSend(channel,msg); return ResultUtil.success(); }

3.5 执行结果

在浏览器上访问接口地址,如:http://localhost:8000/send/jiashn/loveQueena 执行结果如下:

从执行结果,我们看到MessageReceiver类中的receive接收到了渠道/信息,实现了消息的发布/订阅。

上述就是redis的消息的发布/订阅,谢谢大家,希望对大家有所帮助,谢谢!

作者:抢老婆酸奶的小肥仔
链接:https://juejin.cn/post/7233765235953647672

### Redis 发布订阅功能在 Windows 环境下的使用教程及示例 Redis发布订阅(Pub/Sub)模式是一种消息通信机制,允许发送者(生产者)将消息发送到指定的频道,而订阅者可以监听这些频道并接收消息。以下是关于如何在 Windows 环境下使用 Redis发布订阅功能的详细说明代码示例。 #### 1. 环境准备 确保 Redis 已正确安装并运行在 Windows 系统上[^2]。启动 Redis 服务后,需要通过命令行工具 `redis-cli.exe` 连接到 Redis 服务器[^5]。默认端口号为 6379,可以通过以下命令连接: ```bash redis-cli.exe -h 127.0.0.1 -p 6379 ``` #### 2. 订阅者设置 订阅者需要监听特定的频道以接收消息。以下是一个简单的 Java 示例代码,展示如何通过 `StringRedisTemplate` 设置订阅者[^4]。 ```java package com.example.demo.component.redis.message; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; @Service public class Subscriber { @Autowired private StringRedisTemplate redisTemplate; public void subscribe(String channel) { redisTemplate.opsForList().leftPush(channel, "开始监听频道:" + channel); redisTemplate.listenToChannel(channel, (message, pattern) -> { System.out.println("接收到消息: " + message); }); } } ``` 上述代码中,`listenToChannel` 方法用于监听指定的频道,并在接收到消息时执行回调函数。 #### 3. 消息生产者设置 消息生产者负责向指定的频道发送消息。以下是一个 Java 示例代码,展示如何通过 `StringRedisTemplate` 发送消息[^4]。 ```java package com.example.demo.component.redis.message; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; @Service public class Publisher { @Autowired private StringRedisTemplate redisTemplate; public String sendMessage(String channel, String message) { try { // 消息发送 redisTemplate.convertAndSend(channel, message); return "消息发送成功!"; } catch (Exception e) { e.printStackTrace(); return "消息发送失败!"; } } } ``` #### 4. 测试发布订阅功能 为了测试发布订阅功能,可以在同一应用程序中分别启动订阅生产者。首先启动订阅者,然后通过生产者向同一频道发送消息。订阅者会实时接收到生产者发送的消息。 例如,假设频道名称为 `testChannel`,可以按照以下步骤操作: - 启动订阅者:调用 `Subscriber.subscribe("testChannel")`。 - 发送消息:调用 `Publisher.sendMessage("testChannel", "Hello, Redis!")`。 #### 5. 工作原理 Redis 的 Pub/Sub 模式基于频道的概念。生产者将消息发送到指定的频道,所有订阅该频道的客户端都会接收到消息[^3]。这种模式非常适合构建实时通信系统,如即时消息、通知推送等。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值