SpringBoot_redis使用实战(四)_消息模式

redis消息

  • 1.简介
  • 2.入门
    • [2.1 编写消息监听器](#2.1 编写消息监听器)
    • [2.2 注册消息监听器](#2.2 注册消息监听器)
    • [2.3 发送消息](#2.3 发送消息)
  • 3.进阶
    • 3.1ChannelTopic和PatternTopic
      • [3.1.1. ChannelTopic](#3.1.1. ChannelTopic)
      • [3.1.2. PatternTopic](#3.1.2. PatternTopic)
    • [3.2 可靠性](#3.2 可靠性)
  • 4.总结

1.简介

MessageListener是Spring Data Redis中的一个接口,它定义了处理接收到的Redis消息的方法。通过实现MessageListener接口,你可以创建自定义的消息监听器,用于处理从Redis中接收到的消息

2.入门

2.1 编写消息监听器

java 复制代码
@Component
public class MyMessageListener implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] pattern) {
        String channel = new String(message.getChannel());
        String content = new String(message.getBody());
        System.out.println("Received message from channel '" + channel + "': " + content);
    }
}

在这个示例中,MyMessageListener实现了MessageListener接口,并在onMessage方法中处理接收到的消息。

2.2 注册消息监听器

java 复制代码
@Configuration
public class RedisConfig {

    // ... (省略其他配置)

    @Autowired
    private MyMessageListener myMessageListener;

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer() {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(redisConnectionFactory);
          // 配置监听的频道或模式
            container.addMessageListener(messageListener, new ChannelTopic("my-channel"));
        return container;
    }
}

在这个配置类中,我们通过redisMessageListenerContainer方法创建了一个RedisMessageListenerContainer实例,并将MyMessageListener消息监听器注册到了"my-channel"频道上。这样,在应用启动时,Redis就会监听名为"my-channel"的频道,当有消息到达时,会调用MyMessageListener的onMessage方法处理消息。

确保你的MyMessageListener类已经实现了MessageListener接口,并在onMessage方法中定义了处理消息的逻辑。同时,Spring会自动扫描并识别RedisConfig类,确保它被正确加载。

2.3 发送消息

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.data.redis.core.StringRedisTemplate;

@RestController
@RequestMapping("/api/messages")
public class MessageController {

    private final StringRedisTemplate redisTemplate;

    @Autowired
    public MessageController(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @GetMapping("/send/{channel}/{message}")
    public String sendMessage(@PathVariable String channel, @PathVariable String message) {
        // 发送消息到指定的频道
        redisTemplate.convertAndSend(channel, message);
        return "Message sent to channel '" + channel + "': " + message;
    }
}

3.进阶

3.1ChannelTopic和PatternTopic

3.1.1. ChannelTopic

  • 作用: ChannelTopic表示一个具体的消息频道,消息会被发送到这个频道中。订阅者(消息监听器)需要订阅特定的频道,以接收该频道中的消息。

  • 使用场景: 当你想要将消息发送到一个特定的频道,并且只希望特定订阅者能够接收到这个频道中的消息时,你可以使用ChannelTopic。

java 复制代码
ChannelTopic channelTopic = new ChannelTopic("my-channel");
container.addMessageListener(messageListener, channelTopic);

3.1.2. PatternTopic

作用: PatternTopic表示一个消息频道的模式,它允许使用通配符来匹配多个频道。消息会被发送到与模式匹配的所有频道中。

使用场景: 当你希望将消息发送到多个频道,并且这些频道都符合特定的模式时,你可以使用PatternTopic。例如,你可以使用通配符"news.*"表示所有以"news."开头的频道。

java 复制代码
PatternTopic patternTopic = new PatternTopic("news.*");
container.addMessageListener(messageListener, patternTopic);

在使用PatternTopic时,消息监听器会接收所有匹配模式的频道中的消息。这对于需要广播消息给符合特定条件的订阅者的场景非常有用。

选择使用ChannelTopic还是PatternTopic取决于你的具体需求:如果你需要将消息发送到一个特定的频道,使用ChannelTopic;如果你需要将消息发送到多个符合特定模式的频道,使用PatternTopic。

3.2 可靠性

  1. 持久化配置: 如果Redis服务器配置了持久化(例如RDB快照、AOF日志),即使Redis服务器宕机,当Redis重新启动并加载数据时,以前发布的消息仍然可以被新的订阅者消费。

  2. 消息确认机制: Redis的发布/订阅模式本身不提供消息确认机制,即消息的发送者无法确认消息是否被订阅者消费。如果你需要消息确认机制,可以考虑使用消息队列(例如RabbitMQ、Kafka等),这些消息队列通常提供了消息的确认机制,确保消息被成功消费。

  3. 持久订阅者: 在Redis中,普通的订阅者在断开连接后会失去之前的消息,即使重新连接也无法再收到之前发布的消息。

  4. 错误处理和重试策略: 如果消息的消费者处理消息时发生错误,你需要在消费者端实现错误处理和重试策略。例如,在出现异常时,将消息记录到错误日志中,并根据需要进行重试。

4.总结

总的来说,Redis的发布/订阅模式不是为了提供高可靠性消息传递而设计的,它更适用于简单的消息发布和订阅场景。如果你需要更严格的消息可靠性传递和确认机制,建议考虑使用专门的消息队列系统

相关推荐
葫芦和十三14 小时前
图解 MongoDB 08|ESR 原则:复合索引的字段顺序怎么定
后端·mongodb·agent
葫芦和十三21 小时前
图解 MongoDB 07|索引类型:七种索引,七种访问形状
后端·mongodb·agent
朦胧之1 天前
AI 编程-老项目改造篇
java·前端·后端
爱勇宝1 天前
我做了一个只用来搜歌词的小 App
android·前端·后端
IT_陈寒1 天前
SpringBoot自动配置坑了我一晚上,原来问题出在这
前端·人工智能·后端
SelectDB1 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
SelectDB1 天前
秒级弹性、最高降本 70%:SelectDB Serverless 如何重塑云数仓资源效率
大数据·后端·云原生
PinkSun1 天前
Spring AI ChatMemory踩坑实录:重启丢数据、Agent丢记忆、对话溢出
后端·ai编程
壹方秘境1 天前
我用Go语言开发了一个跨平台的HTTPS抓包和调试工具
前端·后端·ios
神秘面具男1 天前
HarmonyOS 6.0跨端远程控制
前端·后端