• Redis订阅发布


    Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接受消息。(微信、微博、关注系统)

    Redis客户端可以订阅任意数量的频道

    订阅发布消息图:

    三个角色:消息发送者、频道、消息订阅者
    在这里插入图片描述

    下图展示了频道channel1,以及订阅这个频道的三个客户端–client2、client5、client1之间的关系:三个客户端订阅了频道1
    在这里插入图片描述

    当有新消息通过PUBLISH命令发送给channel1时,这个消息就会被发送给订阅它的三个客户端:
    在这里插入图片描述

    命令

    这些命令被广泛用于构建即时通信应用,比如网络聊天室、实时直播、实时提醒。

    在这里插入图片描述

    测试

    第一个redis-cli客户端,创建订阅频道,名为runoobChat:

    127.0.0.1:6379> SUBSCRIBE runoobChat
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "runoobChat"
    3) (integer) 1
    
    • 1
    • 2
    • 3
    • 4
    • 5

    现在,我们先重新开启个 redis 客户端,然后在同一个频道 runoobChat 发布两次消息,订阅者就能接收到消息。

    127.0.0.1:6379> PUBLISH runoobChat "Redis publish test"
    (integer) 1
    127.0.0.1:6379> PUBLISH runoobChat "hello"
    (integer) 1
    
    • 1
    • 2
    • 3
    • 4

    总结:

    订阅端:

    127.0.0.1:6379> SUBSCRIBE runoobChat  #订阅一个频道runoobChat
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "runoobChat"
    3) (integer) 1
    # 等待读取推送消息
    1) "message"
    2) "runoobChat"
    3) "Redis publish test"
    1) "message"
    2) "runoobChat"
    3) "hello"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    发送端:

    127.0.0.1:6379> PUBLISH runoobChat "Redis publish test"  #发布者发送消息到频道
    (integer) 1
    127.0.0.1:6379> PUBLISH runoobChat "hello"
    (integer) 1
    
    • 1
    • 2
    • 3
    • 4

    原理

    Redis通过PUBLIAH、SUBSCRIBE、PSUBSCRIBE等命令来实现发布订阅功能。

    通过SUBSCRIBE命令订阅了某频道之后,redis-server里维护了一个字典,字典的键就是一个个频道,而字典的值就是一个链表,链表里保存了所有订阅了这个channel的客户端。SUBSCRIBE命令的关键,就是将客户端添加到给定channel的订阅链表中。

    通过PUBLISH命令向订阅者发送消息,redis-server会使用给定的频道作为键,在它所维护的channel字典中查找订阅这个频道的所有客户端链表,遍历这个链表,将消息发送给所有订阅者。

    使用场景

    • 实时消息系统
    • 实时聊天
    • 订阅、关注系统

    稍微复杂的消息,会使用消息中间件(kafka、RabbitMQ等)来做。

  • 相关阅读:
    数据结构——队列
    MySQL备份与恢复工具之MYSQLDUMP
    A股风格因子看板 (2023.09 第09期)
    有没有EDEM2021.2的Linux版本
    17.cuBLAS开发指南中文版--cuBLAS中的Level-1函数scal()和swap()
    Segmentation fault 的bug解决
    2.21 haas506 2.0开发教程 - TTS - Text To Speech (320开发板)
    R语言计算data.table数据中指定数值变量大于一个固定值、另外两个分组变量的交叉分组对应的统计值(中位数)最小的分组、中位数最小的那个分组
    51单片机学习:IO扩展(串转并)实验-74HC595
    QTcpSocket 接收数据实时性问题
  • 原文地址:https://blog.csdn.net/qq_52025208/article/details/128043439