文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

轻量级消息发布订阅:Redis的适用场景

2024-11-29 18:25

关注

项目如何搭建略过,可以使用 Spring Initializr 或者其他 IDEA 创建一个新的 Spring Boot 项目,并添加相关依赖即可

创建 Redis 消息发布者

创建一个服务类用于发布消息:

@Service
public class RedisPublisherService {

    @Autowired
    private RedisTemplate redisTemplate;

    public void publishMessage(String channel, String message) {
        redisTemplate.convertAndSend(channel, message);
    }
}

创建 Redis 消息订阅者

创建一个服务类用于监听消息:


@Service
public class RedisSubscriberService implements MessageListener {

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

消息监听器绑定监听指定通道


@Configuration
public class RedisConfig {
    // 自定义的消息订阅监听器
    @Resource
    private RedisSubscriberService redisSubscriberService;
    
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate<>();
        //绑定 RedisConnectionFactory
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //创建 Jackson2JsonRedisSerializer 序列方式,对象类型使用 Object 类型,
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.activateDefaultTyping(new LaissezFaireSubTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        // 设置 RedisTemplate 序列化规则,因为 key 通常是普通的字符串,所以使用StringRedisSerializer即可,而 value 是对象时,才需要使用序列化与反序列化。
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // hash key 序列化规则
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        //属性设置后操作
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
    
    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        // 设置连接工厂,RedisConnectionFactory 可以直接从容器中取,也可以从 RedisTemplate 中取
        container.setConnectionFactory(connectionFactory);
        // 订阅名称叫test-channel的通道, 类似 Redis 中的subscribe命令
        container.addMessageListener(redisSubscriberService, new ChannelTopic("test-channel"));
        // 订阅名称以 'user-' 开头的全部通道, 类似 Redis 的 pSubscribe 命令
        container.addMessageListener(redisSubscriberService, new PatternTopic("user-*"));
        return container;
    }
}

测试发布与订阅

创建一个测试类来测试发布和订阅功能:

@Component
public class RedisTestRunner implements CommandLineRunner {

    @Autowired
    private RedisPublisherService publisherService;

    @Autowired
    private RedisSubscriberService subscriberService;

    @Override
    public void run(String... args) throws Exception {
        // 发布消息
        publisherService.publishMessage("test-channel", "Hello, yian!");
        publisherService.publishMessage("user-channel", "Hello, weilai!");
    }
}
来源:一安未来内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯