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[ ...
随机推荐
- python简说(八)random
import randomprint(random.randint(1,23))#随机整数l=[1,2,3,4]s='abcdefeg'print(random.choice(s))#随机选择一个元素 ...
- java调用ws服务
1.找到ws服务地址,例如:http://www.webxml.com.cn/WebServices/MobileCodeWS.asmx 2.新建项目 3.进入命令行窗口,进入当前项目src目录下,然 ...
- Delphi xe5 编译报environment.proj错误的解决
Delphi xe5 在Win64位下编译报 environment.proj 错误,网上有说明: http://hi.baidu.com/fly_king1228/item/9c85fccd8db4 ...
- Bootstrap3基础 img-responsive 响应式图片
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...
- eMMC分区详解【转】
本文转载自:https://blog.csdn.net/wxh0000mm/article/details/77864002 转自:http://blog.csdn.net/junzhang1122/ ...
- Linux 题目收集
目录 1.库函数,系统调用,用户态及内核态 2.查看进程,杀死进程 3.查看文档 4.scp命令 5.不在 sudoers 文件中.此事将被报告 6.chmod: 更改"minikube&q ...
- Java 11 究竟比 8 快了多少?看看这个基准测试
开源规划调度引擎 OptaPlanner 官网发布了一个 Java 11 GC 性能基准测试报告. 当前使用量最大的 Java 版本是 8,所以测试者用 Java 8 与 Java 11 进行对比测试 ...
- ZooKeeper分布式过程协同技术详解2——了解ZooKeeper
这个服务如何实现这些协作方面的原语? ZooKeeper基础
- RabbitMQ.client消息队列
doc 介绍 分类&&典型应用 中文文档 使用
- FPGA 概述2
参考1 参考2:浅论各种调试接口(SWD.JTAG.Jlink.Ulink.STlink)的区别 以下数据仅供参考 文章概要 主流FPGA厂商及产品 相同设计在FPGA与ASIC中耗费器件数量比较 F ...