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[ ...
随机推荐
- k8s device plugin
基本概念入门: Device Manager Proposal Device plugin offical Doc(中文) device-plugins offical Doc(En) Go thro ...
- oracle安全应用角色例子
今天在做看OCP的时候有道题是关于应用安全角色的,不是很明白,在网上找了个例子按照步骤验证了下.QUESTION 48You want to create a role to meet these r ...
- 比较实用的前端 js框架 ,组件 汇总
一.js 前端ui框架 Kendo UI 商用收费,组件丰富,界面简洁美观,有jQuery和angular两个js的版本 Webix 商用收费,组件丰富,界面特别美观 JQwidgets 商用收费,丰 ...
- tp框架中的一些疑点知识--cookie和session的配置
不同的浏览器采用不同的方式保存Cookie. IE浏览器会在"C:\Documents and Settings\你的用户名\Cookies"文件夹下以文本文件形式保存,一个文本文 ...
- FJUT 倒水(倒水问题)题解
题意:开学了, fold拿着两个无刻度, 容量分别是5L和7L的量筒来问Anxdada, 说水是无限的, 并且可以无限次将杯子装满或者清空, 那怎么用这个两个量筒倒出恰好4L水了? 我说简单啊, 先装 ...
- discuz 不能上传头像提示can not write to the data/tmp folder
# discuz 不能上传头像提示can not write to the data/tmp folder 解释: disucz头像上传不成功,提示data/tmp目录没有写入权限,这里的data/t ...
- P3605 [USACO17JAN]Promotion Counting晋升者计数
思路 线段树合并的板子.. 和子节点合并之后在值域线段树上查询即可 代码 #include <cstdio> #include <algorithm> #include < ...
- .Net Core项目在Docker上运行,内存占用过多导致pods重启的问题
默认情况下,.NET Core应用的内存回收模式是Server模式,这种情况下,内存占用和服务器核心数量有关,一半占用量比较大. 我们的应用目前吞吐量都不大,可以采用Workstation模式,这种模 ...
- AngularJS 笔记2
2017-03-23 本文更新链接: http://www.cnblogs.com/daysme/p/6613071.html $http angularjs中的ajax 向服务器请求数据 1/2 后 ...
- linux 基础命令(12月25日笔记)
1. cp指令指令:cp (copy,复制)作用:复制文件/文件夹到指定的位置语法:#cp [-r] 被复制的文档路径 文档被复制到的路径选项: -r:recurs ...