"发布/订阅"可以实现进程间的消息传递

发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端), 而是将信息发送给频道(channel), 然后由频道将信息转发给所有对这个频道感兴趣的订阅者。

发送者无须知道任何关于订阅者的信息, 而订阅者也无须知道是那个客户端给它发送信息, 它只要关注自己感兴趣的频道即可。

发布者(publisher) :发送消息的客户端。

订阅者(subscriber) :通过订阅频道获取消息的客户端,每个频道都可以有任意多个订阅者。

频道(channel) : 负责接收发布者发送的消息,并将消息转发给订阅者。

发布的消息不会持久化,只能收到订阅后的消息,执行subscribe命令后客户端会进入"订阅"状态,处于此状态下的客户端不能使用除 subscribe、unsubscribe、psubscribe和punsubscribe这4个属于"发布/订阅"模式命令之外的命令,否则会报错

发布和订阅命令

127.0.0.1:> publish news-sing tmm  #发布命令
(integer) #订阅者数量
127.0.0.1:> subscribe news-sing    #订阅命令
Reading messages... (press Ctrl-C to quit)
) "subscribe"
) "news-sing"
) (integer)

再次发布

127.0.0.1:> publish news-sing wk
(integer)
Reading messages... (press Ctrl-C to quit)
) "subscribe"
) "news-sing"
) (integer)
) "message"
) "news-sing"
) "wk"

订阅模式

127.0.0.1:> psubscribe news* yl*   #匹配所有已news和yl开头的频道
Reading messages... (press Ctrl-C to quit)
) "psubscribe" #返回值的类型:显示订阅成功
) "news*" #订阅的模式
) (integer) 1 #目前已订阅的模式数量
) "psubscribe"
) "yl*"
) (integer) 2
1) "pmessage" #返回值的类型:信息
2) "news*" #信息匹配的模式
3) "news-play" #信息本身的目标频道
4) "lq" #信息的内容

取消订阅

127.0.0.1:> unsubscribe news-sing    #unsubscribe  不加参数表示退订所有频道
) "unsubscribe"
) "news-sing"
) (integer)

退订指定模式

127.0.0.1:> punsubscribe new*
) "punsubscribe"
) "new*"
) (integer)

pubsub  查看订阅与发布系统状态的内省命令

1)pubsub channels [pattern] : 列出当前活跃的频道(至少有一个订阅者的频道)

  • 如果不给出 pattern 参数,那么列出订阅与发布系统中的所有活跃频道。

  • 如果给出 pattern 参数,那么只列出和给定模式 pattern 相匹配的那些活跃频道。

# client- 订阅 news.it 和 news.sport 两个频道

client-> SUBSCRIBE news.it news.sport
Reading messages... (press Ctrl-C to quit)
) "subscribe"
) "news.it"
) (integer)
) "subscribe"
) "news.sport"
) (integer) # client- 订阅 news.it 和 news.internet 两个频道 client-> SUBSCRIBE news.it news.internet
Reading messages... (press Ctrl-C to quit)
) "subscribe"
) "news.it"
) (integer)
) "subscribe"
) "news.internet"
) (integer) # 首先, client- 打印所有活跃频道
# 注意,即使一个频道有多个订阅者,它也只输出一次,比如 news.it
client-> PUBSUB CHANNELS
) "news.sport"
) "news.internet"
) "news.it" # 接下来, client- 打印那些与模式 news.i* 相匹配的活跃频道
# 因为 news.sport 不匹配 news.i* ,所以它没有被打印 redis> PUBSUB CHANNELS news.i*
) "news.internet"
) "news.it"

2) pubsub numsub [channel-1 ...] : 返回给定频道的订阅者数,订阅模式的客户端不计算在内

# client- 订阅 news.it 和 news.sport 两个频道

client-> SUBSCRIBE news.it news.sport
Reading messages... (press Ctrl-C to quit)
) "subscribe"
) "news.it"
) (integer)
) "subscribe"
) "news.sport"
) (integer) # client- 订阅 news.it 和 news.internet 两个频道 client-> SUBSCRIBE news.it news.internet
Reading messages... (press Ctrl-C to quit)
) "subscribe"
) "news.it"
) (integer)
) "subscribe"
) "news.internet"
) (integer) # client- 打印各个频道的订阅者数量 client-> PUBSUB NUMSUB news.it news.internet news.sport news.music
) "news.it" # 频道
) "" # 订阅该频道的客户端数量
) "news.internet"
) ""
) "news.sport"
) ""
) "news.music" # 没有任何订阅者
) ""

3) pubsub numpat : 返回订阅模式的数量  #注意, 这个命令返回的不是订阅模式的客户端的数量, 而是客户端订阅的所有模式的数量总和

# client- 订阅 news.* 和 discount.* 两个模式

client-> PSUBSCRIBE news.* discount.*
Reading messages... (press Ctrl-C to quit)
) "psubscribe"
) "news.*"
) (integer)
) "psubscribe"
) "discount.*"
) (integer) # client- 订阅 tweet.* 一个模式 client-> PSUBSCRIBE tweet.*
Reading messages... (press Ctrl-C to quit)
) "psubscribe"
) "tweet.*"
) (integer) # client- 返回当前订阅模式的数量为 client-> PUBSUB NUMPAT
(integer) # 注意,当有多个客户端订阅相同的模式时,相同的订阅也被计算在 PUBSUB NUMPAT 之内
# 比如说,再新建一个客户端 client- ,让它也订阅 news.* 频道 client-> PSUBSCRIBE news.*
Reading messages... (press Ctrl-C to quit)
) "psubscribe"
) "news.*"
) (integer) # 这时再计算被订阅模式的数量,就会得到数量为 client-> PUBSUB NUMPAT
(integer)

信息格式

频道转发的每条信息都是一条带有三个元素的多条批量回复(multi-bulk reply)。

  • subscribe : 表示当前客户端成功地订阅了信息第二个元素所指示的频道。 而信息的第三个元素则记录了目前客户端已订阅频道的总数。

  • unsubscribe : 表示当前客户端成功地退订了信息第二个元素所指示的频道。 信息的第三个元素记录了客户端目前仍在订阅的频道数量。 当客户端订阅的频道数量降为 0 时, 客户端不再订阅任何频道, 它可以像往常一样, 执行任何 Redis 命令。

  • message : 表示这条信息是由某个客户端执行 PUBLISH 命令所发送的, 真正的信息。 信息的第二个元素是信息来源的频道, 而第三个元素则是信息的内容。

Redis消息之发布与订阅的更多相关文章

  1. Redis消息的发布与订阅

  2. Redis中的发布与订阅

    redis中实现发布与订阅相对于zookeeper非常简单.直接使用publish和subscribe就行. subscrible news; 订阅news这个channel publish news ...

  3. NodeJS操作Redis实现消息的发布与订阅

    首先先说一下流程: 1.保存数据到Redis,然后将member值publish到 chat频道(publish.js功能) 2.readRedis.js文件此前一直在监听chat频道,readRed ...

  4. 【转】redis 消息队列发布订阅模式spring boot实现

    最近做项目的时候写到一个事件推送的场景.之前的实现方式是起job一直查询数据库,看看有没有最新的消息.这种方式非常的不优雅,反正我是不能忍,由于羡慕本身就依赖redis,刚好redis 也有消息队列的 ...

  5. redis 笔记06 发布与订阅、事务、慢查询日志、监视器

    发布与订阅 1. 服务器状态在pubsub_channels字典保存了所有频道的订阅关系:SUBSCRIBE命令负责将客户端和被订阅的频道关联到这个字典里面,而UNSUBSCRIBE命令则负责 解除客 ...

  6. .NetCore使用Redis,StackExchange.Redis队列,发布与订阅,分布式锁的简单使用

    环境:之前一直是使用serverStack.Redis的客服端,今天来使用一下StackExchange.Redis(个人感觉更加的人性化一些,也是免费的,性能也不会差太多),版本为StackExch ...

  7. redis 事务 及发布于订阅功能

    事务: Redis事务可以一次执行多个命令,事务具有以下特征: 1.隔离操作:事务中的所有命令都会序列化.按顺序地执行,不会被其他命令打扰. 2.原子操作:事务中的命令要么全部被执行,要么全部都不执行 ...

  8. PHP下使用Redis消息队列发布微博(复制)

    phpRedisAdmin :github地址  图形化管理界面 git clone https://github.com/ErikDubbelboer/phpRedisAdmin.git cd ph ...

  9. PHP下使用Redis消息队列发布微博

    phpRedisAdmin :github地址  图形化管理界面 git clone [url]https://github.com/ErikDubbelboer/phpRedisAdmin.git[ ...

随机推荐

  1. Redhat6.4安装MongoDBv3.6.3

    运用后台+配置文件方式启动. 条件 下载mongodb-linux-x86_64-rhel62-3.6.3.tar 官网https://www.mongodb.com/download-center? ...

  2. ldap集成rabbitmq

    rabbitmq版本: 3.7.4 rabbitmq支持ldap需要开启插件:       rabbitmq-plugins enable rabbitmq_auth_backend_ldap rab ...

  3. keras与tensorboard结合使用

    使用tensorboard将keras的训练过程显示出来(动态的.直观的)是一个绝好的主意,特别是在有架设好的VPS的基础上,这篇文章就是一起来实现这个过程. 一.主要原理 keras的在训练(fit ...

  4. 51Nod 1667 概率好题 - 容斥原理

    题目传送门 无障碍通道 有障碍通道 题目大意 若$L_{i}\leqslant x_{i} \leqslant R_{i}$,求$\sum x_{i} = 0$以及$\sum x_{i} < 0 ...

  5. Windows 登录用户的类型

    转载:http://blog.csdn.net/chenlycly/article/details/45419259 1.登录的是超级管理员Administrator 默认情况下,超级管理员Admin ...

  6. pillow生成验证码

    1.结果 2.安装pillow cmd里进入python,pip install pillow,需要等一段时间 3.代码 from PIL import Image, ImageDraw, Image ...

  7. weblogic10以下,许可证过期解决办法

    weblogic10以后的版本已经不再使用license.bea的方式来进行软件授权,之前的历史版本oracle提供了一个免费的许可证更新. 1.首先进入oracle的官网下载地址http://www ...

  8. Selenium Java Selection的使用

    用于向具有drop-down的选择框中输入内容 new Select(new ChromeDriver().findElement(By.cssSelector(" ..."))) ...

  9. Keepalived笔记

    Keepalived高可用服务对之间的故障切换转移,是通过 VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)来实现的. VRRP的出现是为了解决 ...

  10. codeforce 886C Petya and Catacombs (map,思路)

    突然发现百度不到这题的单独题解(果然是因为这是水题么),那我就来写一个了~ 先把题给贴了. C. Petya and Catacombs time limit per test 1 second me ...