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 3 实现色情图片识别
Python 3 实现色情图片识别 项目简介 项目内容 本实验将使用 Python3 去识别图片是否为色情图片,我们会使用到 PIL 这个图片处理库,会编写算法来划分图像的皮肤区域. 项目知识点 Py ...
- MSF基础应用
实践目标 掌握metasploit的基本应用方式. 具体需要完成(1)ms08_067;(2)ms11_050:(3)Adobe(4)成功应用任何一个辅助模块. 报告 虚拟机:可以找我拷贝(我一般都在 ...
- CS224n学习笔记(一)
How do we have usable meaning in a computer? Represents the words as discrete symbols, (离散型变量) Use t ...
- android studio设计模式和文本模式切换
- JUnit Parametrized Tests
Junit allows us to create parametrized tests. Parametrized test class has to be annotated with the @ ...
- Git学习笔记--- diff工具 kdiff3
图形化的git diff 与 git merge工具:kdiff3 1.安装 win10: 去官网左边找到Download,下载双击安装. Linux(Debian Ubuntu 18.04): ap ...
- extern 用法,全局变量与头文件(重复定义)
转自 https://www.cnblogs.com/chengmin/archive/2011/09/26/2192008.html 当你要引用一个全局变量的时候,你就要声明,extern int ...
- IDEA配置SVN,Git,GitLab
集成GitLab插件:http://baijiahao.baidu.com/s?id=1602987918454762059&wfr=spider&for=pc 使用IDEA集成Git ...
- 【基本知识】Flume基本环境搭建以及原理
系统:CentOS6.5JDK:1.8.0_144Flume:flume-ng-1.6.0-cdh5.12.0 一.什么是Flume flume 作为 cloudera 开发的实时日志收集系统,受到了 ...
- P3980 [NOI2008]志愿者招募
思路 巧妙的建图 因为每个志愿者有工作的时段,所以考虑让一个志愿者的流量能够从S流到T产生贡献 所以每个i向i+1连INF-a[x]的边(类似于k可重区间集),每个si向ti连边cap=INF,cos ...