Redis消息之发布与订阅
"发布/订阅"可以实现进程间的消息传递
发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端), 而是将信息发送给频道(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消息之发布与订阅的更多相关文章
- Redis消息的发布与订阅
- Redis中的发布与订阅
redis中实现发布与订阅相对于zookeeper非常简单.直接使用publish和subscribe就行. subscrible news; 订阅news这个channel publish news ...
- NodeJS操作Redis实现消息的发布与订阅
首先先说一下流程: 1.保存数据到Redis,然后将member值publish到 chat频道(publish.js功能) 2.readRedis.js文件此前一直在监听chat频道,readRed ...
- 【转】redis 消息队列发布订阅模式spring boot实现
最近做项目的时候写到一个事件推送的场景.之前的实现方式是起job一直查询数据库,看看有没有最新的消息.这种方式非常的不优雅,反正我是不能忍,由于羡慕本身就依赖redis,刚好redis 也有消息队列的 ...
- redis 笔记06 发布与订阅、事务、慢查询日志、监视器
发布与订阅 1. 服务器状态在pubsub_channels字典保存了所有频道的订阅关系:SUBSCRIBE命令负责将客户端和被订阅的频道关联到这个字典里面,而UNSUBSCRIBE命令则负责 解除客 ...
- .NetCore使用Redis,StackExchange.Redis队列,发布与订阅,分布式锁的简单使用
环境:之前一直是使用serverStack.Redis的客服端,今天来使用一下StackExchange.Redis(个人感觉更加的人性化一些,也是免费的,性能也不会差太多),版本为StackExch ...
- redis 事务 及发布于订阅功能
事务: Redis事务可以一次执行多个命令,事务具有以下特征: 1.隔离操作:事务中的所有命令都会序列化.按顺序地执行,不会被其他命令打扰. 2.原子操作:事务中的命令要么全部被执行,要么全部都不执行 ...
- PHP下使用Redis消息队列发布微博(复制)
phpRedisAdmin :github地址 图形化管理界面 git clone https://github.com/ErikDubbelboer/phpRedisAdmin.git cd ph ...
- PHP下使用Redis消息队列发布微博
phpRedisAdmin :github地址 图形化管理界面 git clone [url]https://github.com/ErikDubbelboer/phpRedisAdmin.git[ ...
随机推荐
- Redhat6.4安装MongoDBv3.6.3
运用后台+配置文件方式启动. 条件 下载mongodb-linux-x86_64-rhel62-3.6.3.tar 官网https://www.mongodb.com/download-center? ...
- ldap集成rabbitmq
rabbitmq版本: 3.7.4 rabbitmq支持ldap需要开启插件: rabbitmq-plugins enable rabbitmq_auth_backend_ldap rab ...
- keras与tensorboard结合使用
使用tensorboard将keras的训练过程显示出来(动态的.直观的)是一个绝好的主意,特别是在有架设好的VPS的基础上,这篇文章就是一起来实现这个过程. 一.主要原理 keras的在训练(fit ...
- 51Nod 1667 概率好题 - 容斥原理
题目传送门 无障碍通道 有障碍通道 题目大意 若$L_{i}\leqslant x_{i} \leqslant R_{i}$,求$\sum x_{i} = 0$以及$\sum x_{i} < 0 ...
- Windows 登录用户的类型
转载:http://blog.csdn.net/chenlycly/article/details/45419259 1.登录的是超级管理员Administrator 默认情况下,超级管理员Admin ...
- pillow生成验证码
1.结果 2.安装pillow cmd里进入python,pip install pillow,需要等一段时间 3.代码 from PIL import Image, ImageDraw, Image ...
- weblogic10以下,许可证过期解决办法
weblogic10以后的版本已经不再使用license.bea的方式来进行软件授权,之前的历史版本oracle提供了一个免费的许可证更新. 1.首先进入oracle的官网下载地址http://www ...
- Selenium Java Selection的使用
用于向具有drop-down的选择框中输入内容 new Select(new ChromeDriver().findElement(By.cssSelector(" ..."))) ...
- Keepalived笔记
Keepalived高可用服务对之间的故障切换转移,是通过 VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)来实现的. VRRP的出现是为了解决 ...
- codeforce 886C Petya and Catacombs (map,思路)
突然发现百度不到这题的单独题解(果然是因为这是水题么),那我就来写一个了~ 先把题给贴了. C. Petya and Catacombs time limit per test 1 second me ...