1 简介
Redis 通过 PUBLISH 、 SUBSCRIBE 等命令实现了订阅与发布模式, 这个功能提供两种信息机制, 分别是订阅/发布到频道和订阅/发布到模式
订阅
发布
2、Redis 发布订阅功能的特性
消息的发送者与接收者之间通过 channel 绑定:channel 可以是确定的字符串,也可以基于模式匹配
客户端可以订阅任意多个 channel
发送者发送的消息无法持久化,所以可能会造成消息丢失
由于消息无法持久化,所以,消费者无法收到在订阅 channel 之间发送的消息
发送者与客户端之间的消息发送与接收不存在 ACK 机制
3、Redis 发布订阅功能的适用场景
由于没有消息持久化与 ACK 的保证,所以,Redis 的发布订阅功能并不可靠。这也就导致了它的应用场景很有限,建议用于实时与可靠性要求不高的场景。例如:
(1)消息推送
(2)内网环境的消息通知
4 springboot集成代码
配置类:
@Configuration
public class RedisListenerConfig {
@Bean
public RedisMessageListenerContainer getContainer(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//添加消息监听 topic:pmp
container.addMessageListener(listenerAdapter(new RedisPmpSub()), new PatternTopic("pmp"));
//添加消息监听 topic:channel
container.addMessageListener(listenerAdapter(new RedisChannelSub()), new PatternTopic("channel"));
return container;
}
@Bean
public MessageListenerAdapter listenerAdapter(RedisMsg redisMsg) {
return new MessageListenerAdapter(redisMsg, "receiveMessage");
}
}
消息通道
//公共接口
@Component
public interface RedisMsg {
public void receiveMessage(String message);
}
public class RedisPmpSub implements RedisMsg{
@Override
public void receiveMessage(String message) {
System.out.println(message);
}
}
public class RedisChannelSub implements RedisMsg{
@Override
public void receiveMessage(String message) {
System.out.println(message);
}
}
消息发送
@Component
public class RedisSender {
private final RedisTemplate redisTemplate;
public RedisSender(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
//向redis消息队列index通道发布消息
@Scheduled(fixedDelay = 2000)
public void sendMessage() {
redisTemplate.convertAndSend("pmp", String.valueOf(RandomUtil.randomInt(1, 1000)));
redisTemplate.convertAndSend("channel", "=====" + String.valueOf(RandomUtil.randomInt(1, 1000)));
}
}
结果:
"=====570"
"764"
"=====986"
"453"
"=====450"
"274"
"=====729"