当前位置: 代码网 > it编程>编程语言>Java > Java使用Redis实现消息订阅/发布的几种方式

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

2025年08月12日 Java 我要评论
redis 提供了 pub/sub (发布/订阅) 模式,允许客户端订阅频道并接收发布到这些频道的消息。以下是 java 中使用 redis 实现消息订阅的几种方式。1. 使用 jedis 客户端添加

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消息订阅/发布的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com