码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【RuoYi-Vue-Plus】学习笔记 36 - Redisson(十)发布 | 订阅功能分析(Redisson 源码)


    文章目录

      • 前言
      • 参考目录
        • 使用文档
        • 发布订阅相关概念
      • 框架集成
        • 版本信息
        • 发布消息 `RedisPubSubController#pub`
        • 订阅消息 `RedisPubSubController#sub`
        • 接口请求控制台打印
      • 功能调用流程分析之【订阅流程】
        • 1、`RedisPubSubController#sub`
        • 2、`RedisUtils#subscribe`
        • 3、`RedissonTopic#addListener`
        • 4、`RedissonTopic#addListenerAsync`
        • 5、`PublishSubscribeService#subscribe`
        • 6、`PublishSubscribeService#subscribeNoTimeout`
        • 7、`PubSubConnectionEntry#subscribe`
        • 8、`RedisPubSubConnection#subscribe`
        • 9、`RedisPubSubConnection#async`
        • 10、Redis 控制台打印结果
      • 功能调用流程分析之【发布流程】
        • 1、`RedisPubSubController#pub`
        • 2、`RedisUtils#publish`
        • 3、`RedissonTopic#publish`
        • 4、`RedissonTopic#publishAsync`
        • 5、`CommandAsyncService#writeAsync`
        • 6、`CommandAsyncService#async`
        • 7、`RedisExecutor#execute`
        • 8、`RedisExecutor#sendCommand`
        • 9、Redis 控制台打印结果
      • 功能调用流程分析之【订阅通道接收到发布消息】
        • 1、`CommandPubSubDecoder#decodeResult`
        • 2、`RedisPubSubConnection#onMessage`
        • 3、`PubSubMessageListener#onMessage`
        • 4、`RedisUtils#subscribe`
        • 5、`RedisPubSubController#sub`
        • 6、控制台打印结果

    前言

    本来承接上篇应该到 OSS 模块的初始化分析了,结果半路杀出个程咬金:在做分析的时候遇到了发布订阅的相关功能的一些问题,去请教了一下 狮子大佬 ,所以决定这篇先简单分析一下发布订阅功能,下一篇再回归 OSS 功能。

    参考目录

    使用文档

    • Redisson 官方文档 - 6.7. 话题(订阅分发)
    • Redis 官方文档 - Redis Pub/Sub

    发布订阅相关概念

    • Redis设计与实现(黄健宏)第18章 发布与订阅
      后面的三篇文章应该都有参考此书。
    • 观察者模式与订阅发布模式的区别
    • 观察者模式与发布订阅模式真的不同
    • Redis进阶 - 消息传递:发布订阅模式详解

    对于相关概念,我就不再在此重复了,感兴趣的朋友可以自行查看或者查找。

    框架集成

    版本信息

    • RuoYi-Vue-Plus V4.3.0
    • Redisson V3.17.5

    发布消息 RedisPubSubController#pub

    在这里插入图片描述
    在这里插入图片描述

    订阅消息 RedisPubSubController#sub

    在这里插入图片描述
    在这里插入图片描述

    接口请求控制台打印

    在这里插入图片描述

    功能调用流程分析之【订阅流程】

    1、RedisPubSubController#sub

    在这里插入图片描述

    2、RedisUtils#subscribe

    在这里插入图片描述
    方法 topic.addListener 是为 RTopic 添加一个监听器,框架中对监听器的方法进行了重写,在后面发布的部分会详细说明。

    3、RedissonTopic#addListener

    在这里插入图片描述

    4、RedissonTopic#addListenerAsync

    在这里插入图片描述
    在这里插入图片描述

    5、PublishSubscribeService#subscribe

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    6、PublishSubscribeService#subscribeNoTimeout

    在这里插入图片描述

    第一次请求时没有 PubSubConnectionEntry 对象,继续执行下面的逻辑(后面存入容器对象 name2PubSubConnection 中),后续请求如果存在对象则直接返回。

    在这里插入图片描述

    7、PubSubConnectionEntry#subscribe

    在这里插入图片描述

    8、RedisPubSubConnection#subscribe

    在这里插入图片描述

    9、RedisPubSubConnection#async

    在这里插入图片描述
    断点到这里后面就不再深入了,是由io.netty.channel.AbstractChannelHandlerContext#safeExecute 这个方法完成底层订阅操作。

    10、Redis 控制台打印结果

    在这里插入图片描述

    功能调用流程分析之【发布流程】

    1、RedisPubSubController#pub

    在这里插入图片描述
    这里 System.out.println("发布通道 => " + key + ", 发送值 => " + value); 实际上就是上面第 3 步中重写的方法中的逻辑。

    2、RedisUtils#publish

    在这里插入图片描述

    3、RedissonTopic#publish

    在这里插入图片描述

    4、RedissonTopic#publishAsync

    在这里插入图片描述

    5、CommandAsyncService#writeAsync

    在这里插入图片描述

    6、CommandAsyncService#async

    在这里插入图片描述
    在这里插入图片描述

    7、RedisExecutor#execute

    在这里插入图片描述

    8、RedisExecutor#sendCommand

    在这里插入图片描述
    同样,断点到这里后面就不再深入了,最后发布操作同样是由io.netty.channel.AbstractChannelHandlerContext#safeExecute 这个方法完成。

    9、Redis 控制台打印结果

    在这里插入图片描述

    功能调用流程分析之【订阅通道接收到发布消息】

    特别说明:这里分析截图用的订阅通道是【test1】,发布消息内容是【test1】。

    如果先进行订阅操作,再进行发布操作,那么在发布完成后订阅通道就能够直接接收到消息,因此实际上这一部分内容在时间上是紧接着【发布流程】的。

    1、CommandPubSubDecoder#decodeResult

    这里解码并根据消息类型进行对应的操作。
    在这里插入图片描述
    这个方法前面还有一些操作步骤(参考以下序列图,只保留了关键方法):
    在这里插入图片描述

    2、RedisPubSubConnection#onMessage

    在这里插入图片描述
    此处的逻辑是遍历所有的监听器,执行 onMessage 方法。

    3、PubSubMessageListener#onMessage

    在这里插入图片描述

    MessageListener 接口:
    在这里插入图片描述

    4、RedisUtils#subscribe

    重写 onMessage 方法:
    在这里插入图片描述
    换种写法比较容易理解:
    在这里插入图片描述

    5、RedisPubSubController#sub

    在这里插入图片描述

    6、控制台打印结果

    在这里插入图片描述

  • 相关阅读:
    1.2 C++编译器对指针的解释方式(深度理解c++指针)
    Bitmap实现原理&应用场景
    JavaScript中setout函数“bug”再研究
    Habor私有仓库
    Python实现基于alpha-beta剪枝技术的五子棋
    RocketMQ源码阅读(九)DefaultMQProducer消息发送
    NR 物理层 卷积
    Python:乘积尾零
    Window 11中安装Rust编译环境和集成开发环境
    VUE3 之 全局 Mixin 与 自定义属性合并策略 - 这个系列的教程通俗易懂,适合新手
  • 原文地址:https://blog.csdn.net/Michelle_Zhong/article/details/126557439
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号