当前位置: 首页 > web >正文

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() {@Overridepublic void onMessage(String channel, String message) {System.out.println("收到消息 - 频道: " + channel + ", 内容: " + message);}@Overridepublic 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>() {@Overridepublic void message(String channel, String message) {System.out.println("收到消息 - 频道: " + channel + ", 内容: " + message);}@Overridepublic void message(String pattern, String channel, String message) {// 模式匹配的消息}@Overridepublic 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 {@Beanpublic 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 {@Overridepublic 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.*");

http://www.xdnf.cn/news/6658.html

相关文章:

  • 三极管知识
  • 根据台账批量制作个人表
  • 5G-A和未来6G技术下的操作系统与移动设备变革:云端化与轻量化的发展趋势
  • 【Pandas】pandas DataFrame kurt
  • 如何让 Google 收录 Github Pages 个人博客
  • go封装将所有数字类型转浮点型,可设置保留几位小数
  • AG-UI 协议:重构多模态交互,开启智能应用新纪元
  • C42-作业练习
  • 光谱相机的空间分辨率和时间分辨率
  • MinIO 开源的分布式文件服务器
  • 三格电子上新了——IO-Link系列集线器
  • 【C++】 —— 笔试刷题day_29
  • el-breadcrumb 面包屑第一项后面怎么写没有分隔符
  • 【实测有效】Edge浏览器打开部分pdf文件显示空白
  • 线程池(ThreadPoolExecutor)实现原理和源码细节是Java高并发面试和实战开发的重点
  • 文件系统交互实现
  • css:无限滚动波浪线
  • Linux du 命令终极指南:从基础到精通
  • 详解具身智能开源数据集:RH20T
  • Maven使用详解:Maven的概述(二)
  • 单片机-STM32部分:18、WiFi模组
  • 真题卷001——算法备赛
  • 小结:JavaScript 模块化工具链
  • 傅里叶变换实战:图像去噪与边缘提取
  • 锚点跳转跟踪#
  • Web-CSS入门
  • ci/cd全流程实操
  • 2025年全国青少年信息素养大赛复赛集训(2):寻找250(题目及解析)
  • Perl测试起步:从零到精通的完整指南
  • 【Python】【OCR识别】 提取图片文字并根据内容智能分类存储