springboot实现Redis发布与订阅消息

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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值