Redis应用场景3-发布/订阅

Redis在实际开发中有哪些应用场景?

Redis在实际开发中有哪些应用场景?下面我结合Redisson来演示Redis在分布式场景中热点数据缓存、计数器、队列、发布/订阅、分布式锁…等场景下的应用。

发布/订阅

在Redis中可以通过publish和subscriber命令来实现一个简单的消息通信中间件,适合用在需要实时通知或者需要轻量级消息队列的场景。

在使用Redis作为消息中间件之前,需要了解三个概念:

  • 1、发布者Publish,就是需要发送消息的客户端,客户端将消息发送给频道Channel。
  • 2、订阅者Subscrib,订阅者也可以看做消费者,就是接收处理Channel中的消息。
  • 3、频道Channel,消息通道。

Redisson对发布/订阅功能也做了高级封装,下面演示代码,其中代码环境配置参考《Redis应用场景1-热点数据缓存》:

package com.example.redisdemo;

import org.junit.jupiter.api.Test;
import org.redisson.api.RFuture;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.PostConstruct;

@SpringBootTest
class PubTests {

    private static final Logger logger = LoggerFactory.getLogger(PubTests.class);

    @Autowired
    private RedissonClient redissonClient;

    /**
     * 发布消息
     *
     * @param message 消息json
     */
    public void publishAsync(RTopic topic, String message) {
        // 异步发布消息
        RFuture<Long> longRFuture = topic.publishAsync(message);
        longRFuture.thenAccept(response -> {
            // 处理响应,例如确认消息发送成功
            logger.info("Publish===============The message published is: {}", message);
        }).exceptionally(e -> {
            // 失败策略,这里可以自己实现消息重发,异常记录等功能。
            // messageReplay() 消息重发 根据实际情况处理
            logger.error("Publish===============Publish message failed, message: {}, error: {}", message, e.getMessage());
            return null;
        });
    }

    //这里通过spring boot的@PostConstruct注解,在项目启动时订阅消息
    //这里我们订阅了test这个topic,如果有消息发布到这个topic,就会收到消息
    @PostConstruct
    public void subscribeTest() {
        //注册两个订阅者
        RTopic test = redissonClient.getTopic("test");
        test.addListener(String.class, (channel, msg) -> logger.info("Subscribe11===============Received message: {}", msg));

        RTopic test2 = redissonClient.getTopic("test");
        test.addListener(String.class, (channel, msg) -> logger.info("Subscribe22===============Received message: {}", msg));
    }


    @Test
    public void publishTest() {
        RTopic test = redissonClient.getTopic("test");
        // 我们这里循环发消息,每条消息间隔一秒
        int count = 0;
        while (true) {
            publishAsync(test, "hello world" + count);
            count++;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }


}

看一下运行结果:

在这里插入图片描述
这里可以看到两个订阅者都收到了消息。

总结

总的来说Redis的发布订阅功能相比于其他传统消息中间件来说,更加轻量级,适用于简单的消息传递场景,消息的实时性更强。在小规模业务场景或者又不想新增消息中间件给系统整体增加风险,使用Redis的发布订阅功能是不错的选择。
当然,相对于专业消息中间件,Redis的功能缺乏一些高级特性,如消息持久化、消息确认、消息重试、消息延迟等。如果需要大数据、持久化、准确性等场景还是建议使用传统消息中间件。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值