当前位置: 首页 > news >正文

redis pubsub

备注:
    每个redis client(服务端保存的表示客户端状态的结构体)都有一个dict(pubsub_channels),保存该client监听的所有channel;key是channel,value为空
    每个redis client都有一个list(pubsub_patterns),保存该client使用模式订阅的所有channel;
 
    每个redisServer内有一个dict(pubsub_channels),保存该redis server上的所有channel以及监听该channel的所有client(channel为key,client list为value)
    每个redisServer内有一个list(pubsub_patterns),保存该server使用模式订阅的所有channel及其client
    
 
 
(1)int pubsubSubscribeChannel(client *c, robj *channel)
   1. 调用dictAdd向client的pubsub_channels加入该channel,如果加入成功,说明该client之前没有监听过该channel
        1> dictFind查找server.pubsub_channels中是否有该channel,如果有,则直接取出该channel的所有client链表;如果没有,则新创建一个空链表。将client指针加入到该client链表中。
    2.通过network发送回应(network代码待学习),通知客户端
 
(2)int pubsubUnsubscribeChannel(client *c, robj *channel, int notify)
    1.调用dictDelete在client的pubsub_channels字典中删除key为channel的元素,如果删除成功,说明client曾监听过该channel
        1> dictFind查找server.pubsub_channels查找key为channel的dictEntry,并通过dictGetVal获取该key对应的value,该value是一个client的list—>clients
        2> 并在1>中的clients中删除当前client
        3> 如果clients为空,则直接在server中删除值为channel的key
    2.如果notify为true,则通知client
    3.返回1
 
(3)int pubsubSubscribePattern(client *c, robj *pattern)
    1.查找c->pubsub_patterns中有没有pattern,如果有,说明该client已经订阅了该模式;如果没有:
        1> 向c->pubsub_patterns中加入pattern,并增加该pattern的引用计数
        2> 利用pattern以及c生成一个pubsubPattern类型的对象,挂到server.pubsub_patterns上
    2.通知客户端
 
(4)int pubsubUnsubscribeAllChannels(client *c, int notify): 退订该client所订阅的所有channel
    1.获取c的pubsub_channels的字典,依次遍历该字典的所有key(key即channel),调用pubsubUnsubscribeChannel退订,并统计退订的channel的总数量—>count
    2.通知客户端
    3.返回count
 
(5)int pubsubUnsubscribeAllPatterns(client *c, int notify)
    1.获取c的pubsub_patterns—>li,依次遍历li的所有元素,每一个元素的value是pattern,对于pattern,调pubsubUnsubscribePattern退订,并统计退订数量—>count
    2.如果notify && count == 0,通知客户端
    3.返回count
 
(6)int pubsubPublishMessage(robj *channel, robj *message)
    1.查找server.pubsub_channels中一channel为key的dictEntry,如果不存在,则跳过;如果存在,获取该dictEntry的value(订阅该channel的client列表),依次向该列表的所有client发送message消息
    2.查找server.pubsub_patterns中的所有节点,对于每个节点,获取pubsubPattern类型对象的指针—>pat,使用Glob-style pattern匹配来比较channel与pat->pattern是否匹配,如果匹配,则向pat->client发送message 

转载于:https://www.cnblogs.com/levy5307/p/9668612.html

相关文章:

  • 【BZOJ4006】管道连接(动态规划,斯坦纳树)
  • 9-18 一次编程面试
  • python学习之路——作业 day6(18/9/18)
  • Kotlin基础学习笔记 (三)
  • 表管理
  • 《手把手教你学DSP-基于TMS320F28335》书中的错误
  • rxjs - 创建数据流
  • Visual-UIElement-FrameworkElement,带来更多功能的同时也带来了更多的限制
  • 源码探究Java_HashMap
  • python-第一个程序
  • 【cs231n】神经网络学习笔记3
  • 实验吧 看起来有点难(手工注入加sqlmap注入)
  • 转: CSS3 @media 用法总结
  • Python_configparser模块
  • js 中的几个假值
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【前端学习】-粗谈选择器
  • bearychat的java client
  • CSS盒模型深入
  • Git学习与使用心得(1)—— 初始化
  • Mac转Windows的拯救指南
  • MQ框架的比较
  • node 版本过低
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • select2 取值 遍历 设置默认值
  • vue-loader 源码解析系列之 selector
  • webpack+react项目初体验——记录我的webpack环境配置
  • 多线程 start 和 run 方法到底有什么区别?
  • 搞机器学习要哪些技能
  • 异步
  • 追踪解析 FutureTask 源码
  • elasticsearch-head插件安装
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 说说我为什么看好Spring Cloud Alibaba
  • %@ page import=%的用法
  • (+4)2.2UML建模图
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (27)4.8 习题课
  • (LeetCode) T14. Longest Common Prefix
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (pytorch进阶之路)扩散概率模型
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)c++ std::pair 与 std::make
  • ******之网络***——物理***
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Framework .NET Core与 .NET 的区别
  • .NET MVC之AOP
  • .Net 中Partitioner static与dynamic的性能对比