Java使用Redis实现消息订阅/发布的几种方式

 更新时间:2025年08月12日 10:41:48   作者:二九筒  
Redis 提供了 Pub/Sub (发布/订阅) 模式,允许客户端订阅频道并接收发布到这些频道的消息,以下是 Java 中使用 Redis 实现消息订阅的几种方式,需要的朋友可以参考下

Redis 提供了 Pub/Sub (发布/订阅) 模式,允许客户端订阅频道并接收发布到这些频道的消息。以下是 Java 中使用 Redis 实现消息订阅的几种方式。

1. 使用 Jedis 客户端

添加依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.3.1</version>
</dependency>

基本订阅示例

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
 
public class RedisSubscriber {
    public static void main(String[] args) {
        // 创建 Jedis 连接
        Jedis jedis = new Jedis("localhost", 6379);
        
        // 创建订阅者
        JedisPubSub subscriber = new JedisPubSub() {
            @Override
            public void onMessage(String channel, String message) {
                System.out.println("收到消息 - 频道: " + channel + ", 内容: " + message);
            }
            
            @Override
            public void onSubscribe(String channel, int subscribedChannels) {
                System.out.println("订阅成功 - 频道: " + channel);
            }
        };
        
        // 订阅频道
        jedis.subscribe(subscriber, "myChannel");
    }
}

发布消息

import redis.clients.jedis.Jedis;
 
public class RedisPublisher {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        jedis.publish("myChannel", "Hello, Redis Pub/Sub!");
        jedis.close();
    }
}

2. 使用 Lettuce 客户端 (推荐)

Lettuce 是另一个流行的 Redis Java 客户端,支持响应式编程。

添加依赖

<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>6.2.3.RELEASE</version>
</dependency>

订阅示例

import io.lettuce.core.RedisClient;
import io.lettuce.core.pubsub.RedisPubSubListener;
import io.lettuce.core.pubsub.StatefulRedisPubSubConnection;
import io.lettuce.core.pubsub.api.sync.RedisPubSubCommands;
 
public class LettuceSubscriber {
    public static void main(String[] args) {
        RedisClient client = RedisClient.create("redis://localhost");
        StatefulRedisPubSubConnection<String, String> connection = client.connectPubSub();
        
        connection.addListener(new RedisPubSubListener<String, String>() {
            @Override
            public void message(String channel, String message) {
                System.out.println("收到消息 - 频道: " + channel + ", 内容: " + message);
            }
            
            @Override
            public void message(String pattern, String channel, String message) {
                // 模式匹配的消息
            }
            
            @Override
            public void subscribed(String channel, long count) {
                System.out.println("订阅成功 - 频道: " + channel);
            }
            
            // 其他需要实现的方法...
        });
        
        RedisPubSubCommands<String, String> sync = connection.sync();
        sync.subscribe("myChannel");
        
        // 保持程序运行以持续接收消息
        try {
            Thread.sleep(Long.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        connection.close();
        client.shutdown();
    }
}

3. Spring Data Redis 集成

如果你使用 Spring Boot,可以更方便地集成 Redis Pub/Sub,这也是比较常用的方式

添加依赖

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

配置 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;
 
@Configuration
public class RedisConfig {
    
    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                                 RedisMessageSubscriber subscriber) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(subscriber, new ChannelTopic("myChannel"));
        return container;
    }
}

配置订阅

import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.stereotype.Component;
 
@Component
public class RedisMessageSubscriber implements MessageListener {
 
    @Override
    public void onMessage(Message message, byte[] pattern) {
        System.out.println("收到消息: " + new String(message.getBody()));
    }
}

发布消息

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
 
@Service
public class RedisMessagePublisher {
    
    private final RedisTemplate<String, Object> redisTemplate;
    
    public RedisMessagePublisher(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
    
    public void publish(String message) {
        redisTemplate.convertAndSend("myChannel", message);
    }
}

高级功能

模式匹配订阅:可以使用 psubscribe 订阅匹配模式的频道

取消订阅

处理连接断开:实现 onPMessageonPUnsubscribe 等方法处理各种事件

//模式匹配订阅
// Jedis
jedis.psubscribe(subscriber, "news.*");
 
// Lettuce
sync.psubscribe("news.*");
 
 
//取消订阅
subscriber.unsubscribe("myChannel");
subscriber.punsubscribe("news.*");

以上就是Java使用Redis实现消息订阅/发布的几种方式的详细内容,更多关于Java Redis消息订阅/发布的资料请关注脚本之家其它相关文章!

相关文章

  • 关于Gateway路由匹配规则解读

    关于Gateway路由匹配规则解读

    本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Gateway的核心功能之一,在配置路由时需要注意顺序、性能和安全性
    2025-02-02
  • Springboot的启动原理详细解读

    Springboot的启动原理详细解读

    这篇文章主要介绍了Springboot的启动原理详细解读,springboot项目一般都是打包成jar包直接运行main方法启动,当然也可以跟传统的项目一样打包war包放在tomcat里面启动.那么springboot怎么直接通过main方法启动呢,需要的朋友可以参考下
    2023-11-11
  • centos7中如何优雅的动态切换jdk版本实例详解

    centos7中如何优雅的动态切换jdk版本实例详解

    这篇文章主要介绍了CentOS7安装多版本jdk并切换jdk版本的完整步骤,文中通过代码详细介绍使用alternatives命令管理多个JDK版本,步骤包括安装不同JDK、配置alternatives及切换版本验证,需要的朋友可以参考下
    2026-06-06
  • SpringMVC @RequestMapping注解作用详解

    SpringMVC @RequestMapping注解作用详解

    通过@RequestMapping注解可以定义不同的处理器映射规则,下面这篇文章主要给大家介绍了关于SpringMVC中@RequestMapping注解用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • .NET到Java迁移的完整指南

    .NET到Java迁移的完整指南

    在技术领域,转型通常意味着漫长的学习和阵痛期,然而,对于经验丰富的.NET开发者而言,转向Java并非从零开始,本指南摒弃泛泛而谈,聚焦于利用你已有的.NET思维模式和工程经验,通过一条高度压缩、直击要害的路径,将你的技能无缝、快速地映射到Java宇宙
    2025-12-12
  • 反对使用Spring封装的多线程类原因

    反对使用Spring封装的多线程类原因

    这篇文章主要介绍了反对使用Spring封装的多线程类原因,文章围绕主题展开详细内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • 详解Java线程池如何实现优雅退出

    详解Java线程池如何实现优雅退出

    这篇文章我们将从源码角度深度解析线程池是如何优雅的退出程序的,文中的示例代码讲解详细,对我们学习java线程池有一定帮助,需要的可以参考一下
    2022-07-07
  • 系统运维问题排查-java内存过高分析及说明

    系统运维问题排查-java内存过高分析及说明

    本文总结了监控Java进程内存与线程状态的常用命令及参数,包括top排序、jmap查看内存分布、jstat分析GC数据、jstack解析线程状态等,强调需使用与进程一致的用户执行,并解析了线程状态和内存区域的含义
    2025-07-07
  • MyBatisPlus实现自动填充字段的实践

    MyBatisPlus实现自动填充字段的实践

    MyBatis-Plus自动填充功能可以在插入或更新数据时自动填充字段,如创建时间和更新时间,本文就来详细的介绍一下,具有一定的参考价值,感兴趣的可以了解一下
    2024-10-10
  • Mybatis注解开发单表、多表操作的实现代码

    Mybatis注解开发单表、多表操作的实现代码

    这篇文章主要介绍了Mybatis高级:Mybatis注解开发单表操作,Mybatis注解开发多表操作,构建sql语句,综合案例学生管理系统使用接口注解方式优化,需要的朋友可以参考下
    2021-02-02

最新评论