zoukankan      html  css  js  c++  java
  • 【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的库中。

  • 相关阅读:
    ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(4)之业务仓储工厂
    ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(3)之创建实体层
    ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(2)之创建项目
    ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(1)之数据库设计
    ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(开篇)
    jQuery验证码发送时间秒递减(刷新存储cookie)
    闲来无事写一个jquery计算器,没有进行封装......
    ASP.NET MVC4.0+EF+LINQ+bui+网站+角色权限管理系统(7)
    <script runat=server>、<%%>和<%#%>的区别
    .net 实现 URL重写,伪静态
  • 原文地址:https://www.cnblogs.com/wf614/p/12919818.html
Copyright © 2011-2022 走看看