程序员子龙(Java面试 + Java学习) 程序员子龙(Java面试 + Java学习)
首页
学习指南
工具
开源项目
技术书籍

程序员子龙

Java 开发从业者
首页
学习指南
工具
开源项目
技术书籍
  • 基础

  • JVM

  • Spring

  • 并发编程

  • Mybatis

  • 网络编程

  • 数据库

  • 缓存

    • Redis

      • Redis基础知识
      • redis底层数据结构
      • 发布和订阅
        • 分分钟搞懂布隆过滤器,亿级数据过滤算法你值得拥有!
        • 缓存和数据库一致性解决方案
        • 详解redis的bitmap
        • 面试常问使用缓存出现的问题
        • Redis hot key 发现以及解决办法
        • Redis实现排行榜功能实战
        • Redis 管道技术——Pipeline
        • 11、RedisTemplate使用最详解(一)--- opsForValue()
        • RedisTemplate使用最详解(二)--- opsForList()
        • RedisTemplate使用最详解(三)--- opsForHash()
        • RedisTemplate使用最详解(四)--- opsForSet()
        • RedisTemplate使用最详解(五)--- opsForZSet()
        • Redis分布式锁-这一篇全了解(Redission实现分布式锁完美方案)
        • 建议收藏!看完全面掌握,最详细的Redis总结
        • Redis分布式锁-这一篇就够了
        • 《进大厂系列》系列-Redis常见面试题
      • 本地缓存

    • 设计模式

    • 分布式

    • 高并发

    • SpringBoot

    • SpringCloudAlibaba

    • Nginx

    • 面试

    • 生产问题

    • 系统设计

    • 消息中间件

    • Java
    • 缓存
    • Redis
    程序员子龙
    2024-01-29
    目录

    发布和订阅

    # 概要

    Redis中的发布和订阅功能允许服务器向指定的频道发送消息,以及客户端可以订阅感兴趣的频道来接收消息。

    Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

    Redis 发布订阅(pub/sub)实现了消息系统,发送者(在redis术语中称为发布者)在接收者(订阅者)接收消息时发送消息。传送消息的链路称为信道。

    在Redis中,客户端可以订阅任意数量的信道。

    发布和订阅功能的实现主要由如下几个命令实现:

    PUBLISH:用于服务器向指定的频道发送消息,格式为:PUBLISH CHANNEL MESSAGE SUBSCRIBE:用于客户端订阅服务器指定具体名字的频道,格式为:SUBCRIBE CHANNEL_NAME PSUBCRIBE:用于客户端订阅服务器指定匹配模式的频道,格式为:SUBCRIBE CHANNEL_PATTERN

    消息订阅:

    # 发布及订阅功能

    1、 基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。

    2、 消息发布者,即publish客户端,无需独占链接,你可以在publish消息的同时,使用同一个redis-client链接进行其他操作(例如:INCR等)

    3、 消息订阅者,即subscribe客户端,需要独占链接,即进行subscribe期间,redis-client无法穿插其他操作,此时client以阻塞的方式等待“publish端”的消息;这一点很好理解,因此subscribe端需要使用单独的链接,甚至需要在额外的线程中使用。

    # Redis 发布/订阅应用场景

    1、实时消息系统

    2、即时通信,频道作为聊天室,将信息回显给订阅频道的所有人

    3、订阅系统,关注系统都是 ok 的

    对于复杂的场景,我们就不用考虑 redis 了,可以直接使用专业的 MQ 开源组件,例如 rabbitMQ 或者 kafka

    # 使用 Redis 发布/订阅 需要注意的点

    使用 Redis 发布/订阅是有缺陷的

    1、对于消息处理可靠性要求不强

    2、消费能力无需通过增加消费方进行增强

    # 使用RedisTemplate实现发布订阅

    生产者:

      public static void publish(String channel,Object message){
            redisTemplate.convertAndSend(channel,message);
        }
    
    1
    2
    3

    消费者:

    @Configuration
    public class RedisMessageListenerConfig {
    
        @Autowired
        public MessageListener redisMessageListener;
    
        @Bean
        RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory){
            RedisMessageListenerContainer container = new RedisMessageListenerContainer();
            container.setConnectionFactory(connectionFactory);
            //频道集合
            List<Topic> topicList = new ArrayList<>();
            topicList.add(new PatternTopic("test"));
            container.addMessageListener(redisMessageListener,topicList);
            return container;
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    @Component
    @Slf4j
    public class RedisMessageListener implements MessageListener {
    
    
        @Override
        public void onMessage(Message message, byte[] bytes) {
            log.info("收到订阅消息 {}", message.toString());
    
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    订阅相同频道的消费者会收到同一个消息。

    上次更新: 2024/01/30, 15:08:57
    redis底层数据结构
    分分钟搞懂布隆过滤器,亿级数据过滤算法你值得拥有!

    ← redis底层数据结构 分分钟搞懂布隆过滤器,亿级数据过滤算法你值得拥有!→

    最近更新
    01
    一个注解,优雅的实现接口幂等性
    11-17
    02
    MySQL事务(超详细!!!)
    10-14
    03
    阿里二面:Kafka中如何保证消息的顺序性?这周被问到两次了
    10-09
    更多文章>
    Theme by Vdoing | Copyright © 2024-2024

        辽ICP备2023001503号-2

    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式