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
订阅匹配模式的频道
取消订阅
处理连接断开:实现 onpmessage
, onpunsubscribe
等方法处理各种事件
//模式匹配订阅 // jedis jedis.psubscribe(subscriber, "news.*"); // lettuce sync.psubscribe("news.*"); //取消订阅 subscriber.unsubscribe("mychannel"); subscriber.punsubscribe("news.*");
以上就是java使用redis实现消息订阅/发布的几种方式的详细内容,更多关于java redis消息订阅/发布的资料请关注代码网其它相关文章!
发表评论