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