• 奔驰R级优惠10.7万元 少量现车火热促销 2019-07-10
  • 侯晓春会见岳剑利一行 2019-07-10
  • 辽宁:电商成为精准扶贫的“利器” 2019-07-04
  • 人人都能享用绿豆汤吗 关于绿豆汤的禁忌你得知道 2019-07-04
  • 早晨空腹饮水有利健康?正确饮水你需要知道这些 2019-07-01
  • 微博大数据:海信强势领跑世界杯“中国赞助队” 2019-06-29
  • 新疆各族群众体验端午传统文化 2019-06-28
  • 感恩消防员 “小志”成获救婴儿新小名(图) 2019-06-28
  • 5G标准出炉!与4G有啥不一样? 或1秒内下载1G电影 2019-06-26
  • 【克山天气】最新克山今天天气,实时提供克山气温、空气质量、24小时天气预报、生活指数查询 2019-06-26
  • 不管怎么讲幸福,老百姓的愿望并不奢望,就是看病不难,不贵,不需要没钱就从手术台赶 下来,只能住医院过道,房子并不要太大,能避风挡雨,子女并不要万贯家财,能有一份 2019-06-24
  • 南岸开展“幸福邻里 粽情端午”志愿服务活动 2019-06-24
  • 一语惊坛(5月9日):推动中朝友谊,造福两国人民。 2019-06-23
  • 网红主播直播违法屡屡发生 法律意识淡薄是主因 2019-06-22
  • “119”消防日大型特别节目《中国骄傲》11月9日播出 2019-06-22
  • Redis队列(三):消息的发布与订阅的C源码实现分 ...  

    青海快三中奖号码 www.yhxn.net 2019-05-06 10:56 发布

    2087 0 0
      一、概述
      在之前的文章分析过,Redis的消息发布与订阅支持基于频道channel的精确订阅与基于模式pattern的模糊订阅,并且是实时的消息传输,不会进行消息存储,如下从源代码来分析Redis的订阅与发布功能的实现,主要在Redis源码的pubsub.c文件定义。

      二、消息订阅
      1. 客户端和服务端的订阅存储结构
      消息订阅主要从客户端client和服务端server两个角度来分析。首先在客户端client和服务端server都会维护一个字典类型dict的pubsub_channels来维护频道channel的订阅关系,维护一个列表类型的pubsub_patterns来维护模式pattern的订阅关系,如下redisServer为服务端数据结构,client为客户端数据结构:
      Redis队列(三):消息的发布与订阅的C源码实现分析
      2. 频道channel的订阅数据结构
      服务端redisServer维护的频道channel订阅字典pubsub_channels和客户端client维护的频道channel的订阅字典pubsub_channels所存储的数据的方式不一样:
      服务端存储的是channel到所有订阅了这个频道的客户端,即channel -> clients的映射,即字典的key为频道channel,值为客户端列表clients;
      客户端存储的是该客户端所订阅过的频道channel,即channel -> NULL,字典的key为频道channel,而值为NULL。
      3. 模式pattern的订阅数据结构
      模式pattern的订阅在服务端和客户端都是使用列表类型的pubsub_patterns来维护,内部存在的模式订阅数据如下:包含客户端的引用client和模式pattern。
      typedef struct pubsubPattern {
      // 客户端引用
      client *client;
      // 该
      robj *pattern;
      } pubsubPattern;
      4. 订阅实现
      频道channel订阅的源码实现
      Redis服务端redisServer接收客户端订阅某个频道的方法实现如下:在服务端redisServer和客户端client的pubsub_channels都需要添加这个映射关系,核心方法为其中dictAdd函数的参数列表为(dict,key,value),所以从以下代码可知服务端value是客户端引用集合clients,客户端的value为NULL。
      Redis队列(三):消息的发布与订阅的C源码实现分析
      模式pattern订阅的源码实现
      源码实现如下:创建模式pattern的订阅pubsubPattern的对象实例pat,pubsubPattern包含客户端引用client和模式字符串pattern,然后将pat对象分别添加到服务端的pubsub_patterns列表和客户端的pubsub_patterns列表。
      Redis队列(三):消息的发布与订阅的C源码实现分析
      三、消息发布
      消息发布源码实现如下:方法参数为channel和message,即将消息message发往频道channel。在内部实现当中:
      首先从服务端的pubsub_channels字典中查找订阅了这个频道channel的所有客户端,然后发送该消息message给这些客户端;
      然后从服务端的pubsub_patterns列表中查找是否存在匹配这个channel的模式pattern,如果存在则将消息发送给对应的客户端client。
      Redis队列(三):消息的发布与订阅的C源码实现分析
      所以Redis的消息发布订阅其实就是通过方法调用指定消息内容message和该消息所属的频道channel,将该消息发送给所有订阅了这个channel的所有客户端,不会进行消息存储。


    *滑块验证:
    您需要登录后才可以回帖 登录 | 网贷社区—注册

    本版积分规则

    银畅金融银畅金融
    优秀作品:9 作者粉丝:0 关注数量:0 拥有金豆:0 荣誉值数:0
    • 售后服务
    • 关注我们
    • 社区新手
    关闭

    站长推荐上一条 /1 下一条

    快速回复 青海快三中奖号码 返回列表
  • 奔驰R级优惠10.7万元 少量现车火热促销 2019-07-10
  • 侯晓春会见岳剑利一行 2019-07-10
  • 辽宁:电商成为精准扶贫的“利器” 2019-07-04
  • 人人都能享用绿豆汤吗 关于绿豆汤的禁忌你得知道 2019-07-04
  • 早晨空腹饮水有利健康?正确饮水你需要知道这些 2019-07-01
  • 微博大数据:海信强势领跑世界杯“中国赞助队” 2019-06-29
  • 新疆各族群众体验端午传统文化 2019-06-28
  • 感恩消防员 “小志”成获救婴儿新小名(图) 2019-06-28
  • 5G标准出炉!与4G有啥不一样? 或1秒内下载1G电影 2019-06-26
  • 【克山天气】最新克山今天天气,实时提供克山气温、空气质量、24小时天气预报、生活指数查询 2019-06-26
  • 不管怎么讲幸福,老百姓的愿望并不奢望,就是看病不难,不贵,不需要没钱就从手术台赶 下来,只能住医院过道,房子并不要太大,能避风挡雨,子女并不要万贯家财,能有一份 2019-06-24
  • 南岸开展“幸福邻里 粽情端午”志愿服务活动 2019-06-24
  • 一语惊坛(5月9日):推动中朝友谊,造福两国人民。 2019-06-23
  • 网红主播直播违法屡屡发生 法律意识淡薄是主因 2019-06-22
  • “119”消防日大型特别节目《中国骄傲》11月9日播出 2019-06-22
  • 山西快乐十分前3 四人冰球 31选7历史记录 吉林快3官网 大乐透规则调整 安徽时时彩平台下载 1970重庆时时彩平台 辽宁快乐12开奖结果双 香港赛马会赛马 刮刮乐蓝玫瑰刮到玫瑰中多少 七星彩走势图近500期 牌九32张牌 幸运飞艇计划人工在线全天免费版 三人斗地主 七星彩走势图下载