大家好,我是一安~
前言
在实际项目中,某些业务场景需要使用消息的发布订阅功能来实现特殊需求。虽然常见的消息中间件如 RabbitMQ、Kafka
和 ActiveMQ
等提供了强大的消息处理能力,但它们通常被认为是较为“重量级”的解决方案,使用成本较高。在一些业务场景中,我们只需要实现消息的发布订阅功能,并不需要保证消息的绝对可靠性和高性能要求。此时,使用 Redis
作为消息中间件无疑是更好的选择。
项目如何搭建略过,可以使用
Spring Initializr
或者其他IDEA
创建一个新的Spring Boot
项目,并添加相关依赖即可
创建 Redis 消息发布者
创建一个服务类用于发布消息:
@Service
public class RedisPublisherService {
@Autowired
private RedisTemplate redisTemplate;
public void publishMessage(String channel, String message) {
redisTemplate.convertAndSend(channel, message);
}
}复制
创建 Redis 消息订阅者
创建一个服务类用于监听消息:
/**
* Redis 消息订阅-消息监听器,当收到阅订的消息时,会将消息交给这个类处理
* 可以直接实现 MessageListener 接口,也可以继承它的实现类 MessageListenerAdapter
* 自动多线程处理
*/
@Service
public class RedisSubscriberService implements MessageListener {
@Override
public void onMessage(Message message, byte[] pattern) {
String channel = message.getChannel().toString();
String data = new String(message.getBody());
System.out.println("Received message from channel " + channel + ": " + data);
}
}复制
消息监听器绑定监听指定通道
/**
* 自定义 RedisTemplate 序列化方式
* 配置主题订阅 - Redis消息监听器绑定监听指定通道
*/
@Configuration
public class RedisConfig {
// 自定义的消息订阅监听器
@Resource
private RedisSubscriberService redisSubscriberService;
/**
* 自定义 RedisTemplate 序列化方式
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
//绑定 RedisConnectionFactory
redisTemplate.setConnectionFactory(redisConnectionFactory);
//创建 Jackson2JsonRedisSerializer 序列方式,对象类型使用 Object 类型,
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(new LaissezFaireSubTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 设置 RedisTemplate 序列化规则,因为 key 通常是普通的字符串,所以使用StringRedisSerializer即可,而 value 是对象时,才需要使用序列化与反序列化。
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// hash key 序列化规则
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
//属性设置后操作
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
/**
* 配置主题订阅
* 可以添加多个监听器,监听多个通道,只需要将消息监听器与订阅的通道/主题绑定即可。
* addMessageListener(MessageListener listener, Collection<? extends Topic> topics):将消息监听器与多个订阅的通道/主题绑定
* addMessageListener(MessageListener listener, Topic topic):将消息监听器与订阅的通道/主题绑定
* @param connectionFactory
* @return
*/
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
// 设置连接工厂,RedisConnectionFactory 可以直接从容器中取,也可以从 RedisTemplate 中取
container.setConnectionFactory(connectionFactory);
// 订阅名称叫test-channel的通道, 类似 Redis 中的subscribe命令
container.addMessageListener(redisSubscriberService, new ChannelTopic("test-channel"));
// 订阅名称以 'user-' 开头的全部通道, 类似 Redis 的 pSubscribe 命令
container.addMessageListener(redisSubscriberService, new PatternTopic("user-*"));
return container;
}
}复制
测试发布与订阅
创建一个测试类来测试发布和订阅功能:
@Component
public class RedisTestRunner implements CommandLineRunner {
@Autowired
private RedisPublisherService publisherService;
@Autowired
private RedisSubscriberService subscriberService;
@Override
public void run(String... args) throws Exception {
// 发布消息
publisherService.publishMessage("test-channel", "Hello, yian!");
publisherService.publishMessage("user-channel", "Hello, weilai!");
}
}复制
如果这篇文章对你有所帮助,或者有所启发的话,帮忙 分享、收藏、点赞、在看,你的支持就是我坚持下去的最大动力!
快试试用 API Key 来保护你的 SpringBoot 接口
文章转载自一安未来,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
国产非关系型数据库 Eloqkv 初体验
JiekeXu
137次阅读
2025-04-10 23:51:35
融合Redis缓存的PostgreSQL高可用架构
梧桐
91次阅读
2025-04-08 06:35:40
PG被黑慢MySQL 360倍,这次我真忍不了
老冯云数
64次阅读
2025-04-16 10:33:52
Redis概要
听溪
40次阅读
2025-04-11 10:23:10
轻量应用服务器2核2G是什么概念?
云知识CLOUD
36次阅读
2025-04-12 10:47:40
安装与配置Redis
鲁鲁
35次阅读
2025-04-11 10:26:10
Redis数据库——Cluster集群模式
编程Cookbook
34次阅读
2025-04-16 15:34:44
图谱动态|学苑周刊 NO.218
图谱学苑
34次阅读
2025-04-01 12:26:56
pgBackRest 预演:验证还原时的恢复目标时间线
飞象数据
31次阅读
2025-04-01 12:26:48
Redis改协议内幕曝光!核心开发者亲述被“踢出局”,外部贡献者几乎全跑光了!
老鱼笔记
30次阅读
2025-04-17 10:41:56