基于Redis实现订阅发布功能

 更新时间:2026年05月12日 08:39:56   作者:Ricoh.  
本文介绍了在SpringBoot项目中使用Redis实现异步解耦的方法,无需引入MQ中间件,首先引入Redis依赖并配置Redis,随后创建Redis配置类来配置Redis连接工厂和监听器,接着创建消息订阅者和发布者,通过RedisTemplate发送消息,最后强调了可以设置多个消息适配器来监听多个channel

背景

业务发展过程中,希望做到异步解耦,但是又不想引入MQ中间件,在中小型服务中,就可以考虑使用redis自带的订阅发布来解决这个问题。使用 Redis 实现消息的订阅和发布时,可以通过 Spring Boot 集成 Redis 来方便地实现。

引入redis依赖

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

配置 Redis

application.properties 文件中,添加 Redis 配置:

spring.redis.host=localhost
spring.redis.port=6379

编写代码

Redis 配置

创建一个配置类来配置 Redis 的连接工厂和监听器:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.data.redis.core.StringRedisTemplate;
@Configuration
public class RedisConfig {
    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                                   MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listenerAdapter, topic());
        return container;
    }
    @Bean
    public MessageListenerAdapter listenerAdapter(RedisMessageSubscriber subscriber) {
        return new MessageListenerAdapter(subscriber, "onMessage");
    }
    @Bean
    public ChannelTopic topic() {
        return new ChannelTopic("messageQueue");
    }
    @Bean
    public StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
        return new StringRedisTemplate(connectionFactory);
    }
}

创建消息订阅者

编写一个类来处理收到的消息:

import org.springframework.stereotype.Service;
@Service
public class RedisMessageSubscriber {
    public void onMessage(String message, String channel) {
        System.out.println("Received message: " + message + " from channel: " + channel);
    }
}

创建消息发布者

编写一个发布者通过 Redis 模板发送消息:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MessagePublisher {
    @Autowired
    private StringRedisTemplate template;
    @Autowired
    private ChannelTopic topic;
    @GetMapping("/publish")
    public String publish(@RequestParam String message) {
        template.convertAndSend(topic.getTopic(), message);
        return "Message published: " + message;
    }
}

如果需要监听多个channel,可以通过RedisConfig中添加新的消息适配器。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.data.redis.core.StringRedisTemplate;
@Configuration
public class RedisConfig {
    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
            MessageListenerAdapter listenerAdapter1,
            MessageListenerAdapter listenerAdapter2) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listenerAdapter1, topic1());
        container.addMessageListener(listenerAdapter2, topic2());
        return container;
    }
    @Bean
    public MessageListenerAdapter listenerAdapter1(RedisMessageSubscriber subscriber) {
        return new MessageListenerAdapter(subscriber, "onMessage");
    }
    @Bean
    public MessageListenerAdapter listenerAdapter2(RedisMessageSubscriber subscriber) {
        return new MessageListenerAdapter(subscriber, "onMessage");
    }
    @Bean
    public ChannelTopic topic1() {
        return new ChannelTopic("channelOne");
    }
    @Bean
    public ChannelTopic topic2() {
        return new ChannelTopic("channelTwo");
    }
    @Bean
    public StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
        return new StringRedisTemplate(connectionFactory);
    }
}

同时RedisMessageSubscriber 也可以书写多个来区分不同的业务场景下不同业务处理。

到此这篇关于Redis分布式系统的原理与实操的文章就介绍到这了,更多相关Redis分布式系统内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RedisDesktopManager无法远程连接Redis的完美解决方法

    RedisDesktopManager无法远程连接Redis的完美解决方法

    下载RedisDesktopManager客户端,输入服务器IP地址,端口(缺省值:6379);点击Test Connection按钮测试连接,连接失败,怎么回事呢?下面小编给大家带来了RedisDesktopManager无法远程连接Redis的完美解决方法,一起看看吧
    2018-03-03
  • redis常用命令整理

    redis常用命令整理

    在本篇文章里小编给大家整理的是关于redis常用命令整理相关内容需要的朋友们可以学习下。
    2020-03-03
  • Redis内存碎片率调优处理方式

    Redis内存碎片率调优处理方式

    Redis集群因内存碎片率超过1.5触发告警,分析发现内因与外因导致内存碎片,内因为操作系统内存分配机制,外因为Redis操作特性,使用Redis内置内存碎片清理机制可有效降低碎片率,但需注意可能影响性能,建议使用MEMORY命令诊断内存使用情况,合理配置参数以优化性能
    2024-09-09
  • CentOS 6.6下Redis安装配置记录

    CentOS 6.6下Redis安装配置记录

    这篇文章主要介绍了CentOS 6.6下Redis安装配置记录,本文给出了安装需要的支持环境、安装redis、测试Redis、配置redis等步骤,需要的朋友可以参考下
    2015-03-03
  • 详解如何清理redis集群的所有数据

    详解如何清理redis集群的所有数据

    这篇文章主要介绍了详解如何清理redis集群的所有数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Redis内存碎片原理深入分析

    Redis内存碎片原理深入分析

    这篇文章主要为大家介绍了Redis内存碎片原理深入分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Redis教程(七):Key操作命令详解

    Redis教程(七):Key操作命令详解

    这篇文章主要介绍了Redis教程(七):Key操作命令详解,本文讲解了Key操作命令概述、相关命令列表、命令使用示例等内容,需要的朋友可以参考下
    2015-04-04
  • Redis下载与安装全过程(Windows版)

    Redis下载与安装全过程(Windows版)

    这篇文章详细介绍了如何在Windows系统上安装和配置Redis,包括下载、安装步骤、配置服务、启动和停止服务以及基本测试方法,同时,还解决了一些常见的连接问题,如外部服务器连接失败
    2026-02-02
  • Windows环境下安装Redis并设置Redis开机自启实践

    Windows环境下安装Redis并设置Redis开机自启实践

    文章介绍了如何在Windows系统上安装和配置Redis,包括下载Windows版本的Redis、设置连接密码、启动Redis、设置开机自启等步骤
    2025-12-12
  • Redis特殊数据类型Geospatial地理空间

    Redis特殊数据类型Geospatial地理空间

    这篇文章主要为大家介绍了Redis特殊数据类型Geospatial地理空间,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05

最新评论