Redis的发布与订阅

  1. 什么是发布订阅
  • Redis发布订阅(pub/sub)是一种消息通讯模式,发送者(pub)发送消息,订阅者(sub)接收消息。
  • Redis客户端可以通过广播的方式将消息(message)同时发送给可能存在的多个客户端,并且发送消息的客户端不需要知道接受消息的客户端的具体信息。(发布消息的客户端和接收消息的客户端两者之间没有直接联系)
  • 客户端可以订阅(subscribe)任意数量的频道(channel),每当有新消息被发送到订阅的频道时,信息就会被发送给所有订阅指定频道的客户端。
  • 一个频道可以被多个客户端订阅,一个客户端也可以订阅多个频道。
  1. 使用场景
  • 实时沟通消息系统
  • 微信公众号(点击关注即订阅该公众号,公众号发布博文后,订阅的用户就可以监听到)
  • 粉丝关注
  • 文章推送
  • 电商中,用户下单成功后向指定频道发送消息,下游业务订阅支付结果处理后续业务。
  1. 图解
    三个客户端分别订阅channel1和channel2 2个频道


    image.png

    发布者(publisher)向channel1频道发送了的消息被channel1的订阅者client1、client2、client3同时接收到,发布者向channel2发送的消息只能被channel2的订阅者client2、client3接收到,client1无法接收


    image.png
  2. 命令行实现

  • 客户端订阅channel1频道(客户端1)
# 订阅1个或者多个频道subscribe channel  [channel ... ]
subscribe channel1
image.png
  • 给channel1频道发送消息 hello(客户端2)
publish channel hello
# 返回频道订阅者的数量
image.png
  • 打开客户端1可以看见发送的消息
image.png
  • 退订频道
unsubscribe  channel  [channel ... ]
  • 查看订阅与发布系统的状态
pubsub channels [argument  [atgument ...] ]
  1. 为什么要使用发布和订阅
  • 消息发送订阅功能很多大厂使用的是kafka、RabbitMQ、ActiveMQ、RocketMQ等消息队列,redis的发布订阅比较前者相对轻量,对于数据安全性要求不高的公司可以直接使用
  • redis的List数据结构提供了blpop、brpop命令结合rpush、lpush可以实现消息队列机制,可以基于双端链表实现消息的发布与订阅(比较笨重,不如直接使用发布订阅功能)
  • 不支持一对多的消息发送
  • 如果生产者的速度远远大于消费者,容易堆积大量未消费的信息
  • 双端队列只能有一个或者多个消费者轮着去消费,但是不能将消息同时发送给其他消费者
  • redis发布订阅模式,生产者生产完消息直接通过频道分发消息给订阅了该频道的所有消费者
  1. 两种实现模式
  • 上述4为“基于频道”的发布订阅模式
  • 基于模式配(pattern)的发布订阅模式
  • 订阅一个或者多个符合给定模式的频道,每个模式以作为匹配符;例如cn 匹配所有以cn开头的频道
psubscribe pattern1  [pattern...]
# 订阅者订阅频道  订阅a?和com.*两种模式的频道  ?表示一个占位符 a?表示匹配 aa、ab、ac等a开头的两个字符的频道
psubscribe a? com.*

# 发布者发布消息
publish ahead "hello" ——————(integer 1) 发布失败,没有订阅者
publish aa "hello"——————(integer 1) 有1个匹配着
publish com.cn "hello"——————(integer 1) 有1个匹配着
  • 退订所有指定模式的频道,如果pattern未指定则订阅的所有模式都被退订
punsubscribe [pattern [pattern ...] ]
  1. 实现原理
  • 基于频道模式
  • 由底层字典实现,所有pubsub_channels是一个字典类型。字典的key为订阅的频道,value为一个链表,链表中保存了所有订阅该频道的客户端
image.png
  • 基于匹配模式
  • 底层由pubsub_pattern节点的链表实现
  • 新增一个pubsub_pattern数据结构添加到链表的最后尾部,同时保存客户端ID
  • 取消订阅模式:从当前的链表pubsub_pattern结构中删除需要取消的pubsub_pattern结构


    image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容