• 【redis】-- redis的发布订阅


    @


    redis的发布订阅功能由PSUBSCRIBE、PUBLISH、PUBSUB、PUNSUBSCRIBE、SUBSCRIBE、UNSUBSCRIBE命令实现。

    在redis中发布订阅的实现非常简单通过一行命令就能实现发布或订阅功能,在redis中由两种订阅类型,一个是频道订阅,只订阅某一个频道。还有一个是模式订阅,通过对channel的模式匹配来订阅多个频道。

    无论是频道的订阅还是模式的订阅,其订阅的频道都是由PUBLISH命令来发布的。

    • publist :将信息 message 发送到指定的频道 channel。返回值:integer-reply: 收到消息的客户端数量
    PUBLISH channel message
    

    下面我们来讲一下这两种订阅模式。

    1.频道的订阅与退订

    频道的订阅和退订是由SUBSCRIBE、UNSUBSCRIBE命令实现两个命令实现。

    如A,B,C三个客户端都订阅news.it频道

    subscribe news.it
    

    图片

    那么,在订阅之后这三个客户端就可以看到news.it频道上发生的消息。此时如果

    publist news.it hello
    

    那么A,B,C都会收到该信息。
    图片

    如果对频道发送的信息不感兴趣,想要退订,那么使用

    unsubscribe news.it
    

    redis的发布订阅功能,其底层是通过一个链数组来实现的。每一个频道都放到数组中,如果有客户端订阅该频道就把该客户端挂在,对应节点的后面;
    图片

    如果在订阅时,被订阅的节点还不存在,那么redis就会在新开出一个频道节点放在数组的尾部,然后把订阅该频道的客户端,挂在新建节点的后面。

    如上面没有news.movie频道那么

    subscribe news.movie news.sport
    

    其实现就为
    图片

    ,在退订时就把对应的节点从频道对应的链表中删掉就好了。如果每次退订后,频道后的链表边为空,就会把其删掉。

    unsubscribe news.movie news.sport
    

    图片

    2.模式的订阅与退订

    模式的订阅与退订,和频道的订阅其实相差不大,就是模式会一次订阅对应模式的所有频道。

    模式的订阅和退订是通过psubscribe和punsubscribe来实现

    如订阅一个模式

    psubscribe news.*
    

    就会订阅所以名称含有news.的频道
    图片

    当频道发信息时,只要是与模式相同的频道的信息都会发给订阅该模式的客户端。

    模式的退订和订阅类似,就不赘述;

    在redis中模式订阅与频道订阅不同。模式订阅被放在一个链表中,链表节点存储了订阅模式的客户端和被订阅的模式。

    图片

    故模式的订阅和退订就是对链表的添加和删除。

    3.查看订阅信息

    pubsub可查看频道相关信息

    PUBSUB CHANNELS [pattern]

    列出当前active channels.活跃是指信道含有一个或多个订阅者(不包括从模式接收订阅的客户端) 如果pattern未提供,所有的信道都被列出,否则只列出匹配上指定全局-类型模式的信道被列出.

    127.0.0.1:6379> PUBSUB channels
    1) "a2"
    2) "a1"
    

    PUBSUB NUMSUB [channel-1 ... channel-N]

    列出指定信道的订阅者个数(不包括订阅模式的客户端订阅者)(个数应该是测量了,频道后面链表的长度,而模式订阅者不在该链表中所以会被排除在外)

    127.0.0.1:6379> PUBSUB numsub a1
    1) "a1"
    2) (integer) 1
    

    返回值
    array-reply: 信道的列表和每个列表中订阅者的个数. 格式为 信道,个数,信道,个数,… 简单的列表.

    注意,不给定任何频道而直接调用这个命令也是可以的, 在这种情况下,命令只返回一个空列表.

    PUBSUB NUMPAT

    返回订阅模式的数量(使用命令PSUBSCRIBE实现).注意, 这个命令返回的不是订阅模式的客户端的数量, 而是客户端订阅的所有模式的数量总和。

    integer-reply: 客户端订阅的所有模式的数量总和

    127.0.0.1:6379> PUBSUB numpat
    (integer) 1
    

    只有一个模式在redis的库中。

  • 相关阅读:
    Android ViewPager用法小结
    HDU1212 Big Number 【同余定理】
    1051. Pop Sequence (25)
    FFmpeg源码结构图
    oracle访问不同用户的表不添加用户名前缀
    window7开启Administrator账户
    Window下对nodejs多版本管理GNVM
    基于Centos7.5搭建Docker环境
    grep与孪生兄弟egrep差异
    Linux编译步骤概述
  • 原文地址:https://www.cnblogs.com/wf614/p/12326904.html
Copyright © 2020-2023  润新知