Java使用Redis實(shí)現(xiàn)消息訂閱/發(fā)布的幾種方式
Redis 提供了 Pub/Sub (發(fā)布/訂閱) 模式,允許客戶端訂閱頻道并接收發(fā)布到這些頻道的消息。以下是 Java 中使用 Redis 實(shí)現(xiàn)消息訂閱的幾種方式。
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) {
// 創(chuàng)建 Jedis 連接
Jedis jedis = new Jedis("localhost", 6379);
// 創(chuàng)建訂閱者
JedisPubSub subscriber = new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
System.out.println("收到消息 - 頻道: " + channel + ", 內(nèi)容: " + message);
}
@Override
public void onSubscribe(String channel, int subscribedChannels) {
System.out.println("訂閱成功 - 頻道: " + channel);
}
};
// 訂閱頻道
jedis.subscribe(subscriber, "myChannel");
}
}發(fā)布消息
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 是另一個(gè)流行的 Redis Java 客戶端,支持響應(yīng)式編程。
添加依賴
<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 + ", 內(nèi)容: " + message);
}
@Override
public void message(String pattern, String channel, String message) {
// 模式匹配的消息
}
@Override
public void subscribed(String channel, long count) {
System.out.println("訂閱成功 - 頻道: " + channel);
}
// 其他需要實(shí)現(xiàn)的方法...
});
RedisPubSubCommands<String, String> sync = connection.sync();
sync.subscribe("myChannel");
// 保持程序運(yùn)行以持續(xù)接收消息
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()));
}
}發(fā)布消息
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);
}
}高級(jí)功能
模式匹配訂閱:可以使用 psubscribe 訂閱匹配模式的頻道
取消訂閱
處理連接斷開:實(shí)現(xiàn) onPMessage, onPUnsubscribe 等方法處理各種事件
//模式匹配訂閱
// Jedis
jedis.psubscribe(subscriber, "news.*");
// Lettuce
sync.psubscribe("news.*");
//取消訂閱
subscriber.unsubscribe("myChannel");
subscriber.punsubscribe("news.*");以上就是Java使用Redis實(shí)現(xiàn)消息訂閱/發(fā)布的幾種方式的詳細(xì)內(nèi)容,更多關(guān)于Java Redis消息訂閱/發(fā)布的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot中的controller注意事項(xiàng)說明
這篇文章主要介紹了springboot中的controller注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java concurrency之LockSupport_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java concurrency之LockSupport的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
IntelliJ IDEA 2020.2正式發(fā)布,兩點(diǎn)多多總能助你提效
這篇文章主要介紹了IntelliJ IDEA 2020.2正式發(fā)布,諸多亮點(diǎn)總有幾款能助你提效,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-07-07

