`

redis(四)-pub/sub 发布/订阅

 
阅读更多

参考:

http://www.sxrczx.com/pages/shift-alt-ctrl.iteye.com/blog/1867454.html

 

一、是什么

       1、redis的发布/订阅是为用户订阅频道,广播发送的一种消息推送机制。

       2、发布者不是将消息直接发送给订阅者,而是将消息发送给频道(channel),然后由频道将消息转发给所有对频道感兴趣的订阅者。

       3、发布者无需知道任何订阅者的信息。

       4、订阅者也无需知道是那个客户端给他发送的消息,它只要关注自己喜欢的频道就行了。

二、优点

    1、发布者和订阅者非耦合,可以极大的提高系统的扩展性,并得到一个更动态的网络拓扑。

三、缺点

       1、服务器只做消息的转发,不会保留。消息即发即得,消息的订阅者也只能接受到订阅之后的消息。

       2、做到了消息发布和订阅的基本能力,但尚未提供JMS中关于消息的持久化等各种企业级的特性。

四、怎么用

1、订阅喜欢的两个频道
redis> SUBSCRIBE foo bar

2、消息的格式

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

    消息的第一个元素标识了消息的类型:

        subscribe:表示当前客户端成功的订阅了消息第二个元素所指示的频道。

        unsubsribe: 表示当前客户端成功退订了消息第二个元素所指示的频道。

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

    消息的第二个元素标识了消息的频道:频道名称

    消息的第三个元素标识了消息订阅的频道数:记录了客户端目前仍在订阅的频道数量。

1、客户端连接服务端
   redis-cli
2、输入订阅命令
127.0.0.1:6379> SUBSCRIBE news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
3、再重新开启个界面,连接服务端
      redis-cli
4、在第二个窗口输入发布命令
[root@www ~]# redis-cli 
127.0.0.1:6379> PUBLISH news 'i am joandora'
(integer) 1
 5、在第一个窗口就会收到消息
127.0.0.1:6379> SUBSCRIBE news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
1) "message"
2) "news"
3) "i am joandora"
 
 3.频道订阅-支持模式匹配

     客户端订阅的模式里面可以包含多个glob风格的通配符,比如:*  、 ?  和 [...] 等等。订阅的命令:PSUBSCRIBE、PUNSUBCRIBE

    比如说,执行命令:

redis> PSUBSCRIBE news.*

    客户端将收到来自news.art、news.music等频道的信息。

4、客户端同时订阅两种模式

    如果客户端订阅的多个模式匹配了同一个频道,或者客户端同时订阅了某个频道、以及匹配这个频道的某个模式,那么它可能会多次接收到同一条信息。

SUBSCRIBE foo
PSUBSCRIBE f*

    那么当有信息发送到频道foo时,客户端将收到两条信息:一条来自频道foo,信息类型为message;另一条来自模式f*,信息类型为pmessage。

五、注意点

    1、消息发布者,无需独占连接。你可以在发布消息的同时,使用同一个redis-cli连接进行其他操作。

    2、消息的接收者,需独占连接,将以阻塞的方式等待接收服务端publish消息。

    3、一旦subscribe端断开链接,将会失去部分消息,如果你非常关注每个消息,那么你应该考虑使用JMS或者基于Redis做一些额外的补充工作,如果你期望订阅是持久的,那么如下的设计思路可以借鉴(如下原理基于              JMS):

    1) subscribe端首先向一个Set集合中增加“订阅者ID”,此Set集合保存了“活跃订阅”者,订阅者ID标记每个唯一的订阅者,例如:sub:email,sub:web。此SET称为“活跃订阅者集合”
    2) subcribe端开启订阅操作,并基于Redis创建一个以“订阅者ID”为KEY的LIST数据结构,此LIST中存储了所有的尚未消费的消息。此LIST称为“订阅者消息队列”
    3) publish端:每发布一条消息之后,publish端都需要遍历“活跃订阅者集合”,并依次向每个“订阅者消息队列”尾部追加此次发布的消息。
    4) 到此为止,我们可以基本保证,发布的每一条消息,都会持久保存在每个“订阅者消息队列”中。
    5) subscribe端,每收到一个订阅消息,在消费之后,必须删除自己的“订阅者消息队列”头部的一条记录。
    6) subscribe端启动时,如果发现自己的自己的“订阅者消息队列”有残存记录,那么将会首先消费这些记录,然后再去订阅。

、应用场景

    1、服务器控制及监控:http://m.blog.csdn.net/blog/liguohui/7706815

    2、日志记录:http://irayd.com/blog/use-redis-pub-sub/

 

 

 

 

 

 

 

 

 

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
分享到:
评论

相关推荐

    dtalk(Device Talk)基于Redis发布订阅(pub/sub)系统实现的前端设备控制框架(java)

    dtalk就是为了实现上述的目标而开发的一个Redis发布订阅(pub/sub)系统实现的前端设备控制框架,在dtalk框架上,Redis服务器用于提供中转服务。前端设备通过订阅特定的频道接收管理发送的请求消息,执行对应的功能。...

    socket-redis:WebSocket pubsub服务器和客户端(带有SockJS),通过Redis公开API

    服务器将允许您在 pub / sub通道socket-redis-up上使用与客户端相关的事件,例如message , subscribe和unsubscribe 。 此外,它将订阅另一个发布/订阅通道socket-redis-down ,您可以在其中向通道中的所有客户端...

    hubot-synapse:使用redis pub-sub允许Hubot合并用其他语言编写的脚本

    突触 使用Redis pub-sub允许Hubot合并用其他语言编写的脚本。正在安装 npm install hubot-synapse并向您的Hubot的external-scripts.json文件添加hubot-synapse // external-scripts.json[ 'hubot-synapse' ]为什么?...

    redis-pubsubber:Redis 发布订阅通道包装器

    // create pub/sub instance (creates redis pub and sub clients var redisPubSub = require ( 'redis-pubsubber' ) ( 'mycloud' , 6379 , 'localhost' ) ; // create a channel var redisChannel = redisPubSub ...

    beygir:结合 redis pub-sub 和 worker-farm 的简单工作队列实现

    结合 redis pub-sub 和 worker-farm 的简单工作队列实现。 beygir 依赖于 ,这是一个非常简单有用且稳定的子进程控制器包。 (在 npm 中可用,名称为 node-worker-farm)。 启动时,beygir 订阅 redis pubsub 频道...

    redis发布订阅.zip

    redis具有发布订阅的功能, 利用redis的pub/sub发布订阅功能,可以实现都key的监听,当key准备好之后可以通知---适用于异步处理 比如异步打包大量数据包,上传至fdfs,等fdfs返回地址后通知其他业务系统,不需要...

    RedisDesktopManager2019.0

    非常流行的Redis可视化client最新版。 官方不面向 Mac OS X 和 Windows 平台的非订阅用户...1.Pub/Sub 管道监控 (参考https://redis.io/topics/pubsub) 改善: 1.提高性能并减少已用内存 2.改进 es_ES 语言的翻译

    Redis 发布订阅

    Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 ...

    (纯)Swift的Redis客户端-Swift开发

    具有DISCARD脚本的发布/订阅管道功能所有命令安装将Redis添加到Package.swift import PackageDescription let package = Redis一个用于Redis的纯Swift客户端。 具有DISCARD脚本的功能Pub / Sub管道所有命令安装将...

    由Nginx支持的快速,水平可扩展的多进程发布/订阅队列服务器和HTTP,长轮询,Websockets和EventSource(SSE)的代理。-C/C++开发

    https://nchan.slact.net Nchan是现代Web的可伸缩,灵活的发布/订阅服务器,作为Nginx Web服务器的模块而构建。 它可以配置为独立服务器,也可以配置为应用程序与数百个服务器之间的中介服务器。...

    pub-sub-handler:消息上带有 ObjectKey 的 Redis PubSub

    酒馆子处理程序这是为了与 Redis 一起用作发布/订阅处理程序而编写的。 它只是一个旨在帮助管理套接字的包装器。设置: var psh = require( 'pub-sub-handler' )( { host: localhost, port: 6379 }, function( ...

    graphql-redis-subscriptions:使用redis和apollo的graphql-subscriptions的graphql订阅实现

    它允许您将订阅管理器连接到Redis Pub Sub机制,以支持多个订阅管理器实例。 安装 首先,安装graphql-redis-subscriptions软件包: npm install graphql-redis-subscriptions 由于软件包被声明为对等依赖项,如果...

    redis_pub_sub:redis发布与订阅

    redis发布与订阅功能 一、创建publisher,使用redisTemplate发布消息的方法,将消息发布到channel中 @Service public class PubServiceImpl implements PubService { @Autowired private StringRedisTemplate ...

    redis基础资料

    同时Redis还具有其它一些特性,其中包括简单的事物支持、发布订阅 ( pub/sub)、管道(pipeline)等 。 Redis具有丰富的客户端,支持现阶段流行的大多数编程语言。php常用的是phpredis, JAVA常用的是Jedis( ...

    Introduction-to-redis

    Redis简介在Ubuntu中安装Redis 要将Redis安装在ubuntu中... 其次,您需要使用node_redis项目并为发布者和订阅者创建一个Client。 注意,我们在这里使用默认的客户端设置。 var redis = require ( "redis" ) ;var pub =

    Redis Stream

    Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。...

    RPS-View:Redis Pub SUb

    一个Web或桌面应用程序,可帮助可视化和监视Redis发布订阅客户端。 **注意:如果您想进行电子束缚,请移至电子暂存分支。 问题 在开发中测试您的Redis pub子客户端需要多个redis cli客户端。 我们的工具使您可以在一...

    redis中文帮助文档

    redis中文文档, 本文所有示例代码均经过 Redis 2.6 版本测试,质量保证。 目录 Key(键) String(字符串) Hash(哈希表) ...Pub/Sub(发布/订阅) Transaction(事务) Script(脚本 Connection(连接) Server(服务器)

    pubsub:Golang的Redis PubSub概念实现

    SUBSCRIBE,UNSUBSCRIBE和PUBLISH实现了“发布/订阅”消息传递范例,其中(引用Wikipedia)发送者(发布者)没有被编程为将其消息发送给特定的接收者(订阅者)。 (位于) 安装及使用 安装 go get github....

    Redis.SilverlightClient:从 Silverlight 使用 Redis 的组件

    Redis.SilverlightClient ##Redis.Silverlight 客户端是一个库,用于订阅 Redis PUB/SUB 频道,由于 Silverlight 网络访问限制,该频道监听范围为 4502-4534 的端口。 ##SilverlightPolicyServer 是一个组件,用于在...

Global site tag (gtag.js) - Google Analytics