Redis订阅与发布

发布与订阅模型在许多编程语言中都有实现,也就是我们经常说的设计模式中的一种--观察者模式。在一些应用场合,例如发送方并不是以固定频率发送消息,如果接收方频繁去咨询发送方,这种操作无疑是很麻烦并且不友好的。

举个生活的例子,一个喜欢购买鲜牛奶的人,需要每天在上班的时候/下班的时候都专门去牛奶店购买鲜牛奶,但不一定每天去到那里都刚好有自己喜欢的那一种牛奶,这个时候,这个人跑老远的距离都白费了。但如果这个人去牛奶店一次性订阅了一个月的某种牛奶,那么他就不用担忧今天是否能买到鲜牛奶了,只要送奶员把牛奶送到他家楼下的箱子里面就行。

而订阅发布模型与这个例子有点类似,订阅者只要订阅注册某个频道就可以“高枕无忧”了,当有消息发送过来的时候,会通过订阅的频道接收。优势在于把耦合点独立分离处理,作为发布方和接收方的中介,实现了发布方和接收方的隔离,

订阅与发布系统是Redis的一个高级属性,多个客户端可以同时订阅同一个频道,类似广播的机制。所不同的是,一个客户端可以同时订阅多个频道。

样例图:

Redis订阅发布系统,服务器在背后的工作:

服务器中维护着一个pubsub_channels字典,所有的频道和订阅关系都存储在这里。字典的键为频道的名称,而值为订阅频道的客户端链表。

1. 当有新的客户端订阅某个频道时,会发生两种情况中的一种:

1)如果频道已经存在,则新的客户端会添加到pubsub_channels对应频道的链表末尾

2)如果频道原本不存在,则会为频道创建一个键,该客户端成为链表的第一个元素

2. 当一个客户端退订一个频道的时候:

pubsub_channels对应键的链表会删除该客户端

3. 发送信息

服务器会遍历pubsub_channels中对应键的链表,向每一个客户端发送信息

服务器还维护着一个pubsub_patterns链表,链表的pattern属性记录了被订阅的模式,而client属性记录了订阅模式的客户端

1. 当有新的客户端订阅某个模式的时,会进行如下步骤:

1)创建一个链表节点,pattern属性记录订阅的模式,client记录订阅模式的客户端

2)将这个链表节点添加到pubsub_patterns链表中

2. 当一个客户端退订某一个模式的时候:

服务器遍历pubsob_patterns找到对应的pattern同时也是对应该client客户端的节点,将改节点删除

3. 发送信息

服务器遍历pubsub_channels,查找与channels频道相匹配的模式麻将消息发送给订阅了这些模式的客户端。

Redis订阅系统的优势:

1. 当一个客户端向频道发送一个信息,订阅了同一个频道/模式的多个客户端可以同时接收到信息,类似广播的机制。

2. 便于Sentinel哨兵与服务器间的通信并进行监控

 

1. 订阅频道

命令格式:

SUSCRIBE   channel1  [channel2]  [channel3]

例如(同时订阅两个频道):

redis> subscribe  local_system  remote_system

Reading messages... (press Ctrl-C to quit)

1) "subscribe"       # 返回值的类型:显示订阅成功

2) "local_system"           # 订阅的频道名字

3)"remote _system "

4) (integer) 2       # 目前已订阅的频道数量

订阅和接收者:

发送者:

注意:客户端一点与某个频道建立连接就不能进行其他操作,一旦客户端退出连接,订阅的频道自动会断开。

2. 订阅模式

PSUBSCRIBE  pattern1  [pattern2]  [pattern3]

pattern可以用符号*进行模糊匹配,例如:

remo*   #匹配以remo开头的模式

*system  #匹配以system结尾的模式

例如:

客户端1

客户端2

注意:返回的integer为1是指匹配了一个模式,实际上是匹配了两个频道。

发布信息命令:

客户端:

3. 取消订阅:

命令:

1)取消订阅频道

UNSUBSCRIBE  channel1  [channel2]

2)取消订阅模式

PUNSUBSCRIBE  [pattern [pattern …]]

由于在客户端界面无法实现,这里就不展示了。而在编程过程中是可以实现的。

关于python中的编程,可以看看这篇文章:

http://www.cnblogs.com/anpengapple/p/7027979.html

4. 发布消息

命令:

PUBLISH channel message

向一个频道发送信息,所有订阅这个频道的客户端都会接收到信息

5. 查看已有的频道

命令:

PUBSUB  subcommand [argument [argument ...]]

subcommand子命令:

1)PUBSUB CHANNELS  [pattern]

列出当前的活跃频道

如果给定pattern参数,则会返回服务器当前被订阅的频道中与pattern模式相匹配的频道

2)PUBSUB NUMSUB [channel-1 … channel-N]

返回给定频道的订阅者数量, 订阅模式的客户端不计算在内

因为有一个是匹配模式,所以返回的interger值为1

3)PUBSUB NUMPAT

返回订阅模式的数量

Sentinel哨兵中的应用:

Sentinel服务器与Master服务器/Slave服务器之间的订阅发布系统是Sentinl监控过程的一个重要环节,通过订阅发布系统达到监控服务器状态的作用。其运行原理与上面的客户端服务器之间的订阅机制无太大区别,都是基于网络连接的数据传输。Sentinel之间的通信也是通过Sentinel与服务武器间的这个订阅发布系统实现的,一个Sentinel通过服务器的频道发送信息,其他Sentinel就会接收到。

参考文章:

http://www.cnblogs.com/anpengapple/p/7027979.html

《redis设计与实现》

原文地址:https://www.cnblogs.com/thomson-fred/p/10363758.html

时间: 2024-10-14 21:00:52

Redis订阅与发布的相关文章

Redis订阅和发布模式和Redis事务

-------------------Redis订阅和发布模式------------------- 1.概念 Redis 发布订阅(pub/sub)是一种消息通信模式: 发送者(pub)发送消息, 订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 2.subscribe channel:订阅个指定频道的信息 3.publish channel message:将信息message 发送到指定的频道channel 4.应用场景 1.今日头条订阅号.微信订阅公众号.新浪微博关

redis 订阅与发布

PUBLISH,SUBSCRIBE,等命令实现订阅与发布 订阅/发布到频道 订阅/发布到模式 频道的订阅与信息发送   订阅subscribe,可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时,信息就会被发送给所有订阅指定频道的客户端: 当有新消息通过publish命令发送给频道channel1时,这个消息就会被发送给订阅它的三个客户端: 订阅频道 每个 Redis 服务器进程都维持着一个表示服务器状态的 redis.h/redisServer 结构,结构的 pubsub_ch

python实现 redis订阅与发布

订阅者可以订阅一个或多个频道,发布者向一个频道发送消息后,所有订阅这个频道的订阅者都将收到消息,而发布者也将收到一个数值,这个数值是收到消息的订阅者的数量.订阅者只能收到自它开始订阅后发布者所发布的消息,之前发布的消息呢,就不可能收到了. 多的不说看代码!!! 面向过程的方法 #!/usr/bin/python #coding:utf-8 #服务器端 import redis r = redis.Redis(host='127.0.0.1',port='6379') #连接redis p = r

redis pub/sub 发布订阅

Redis的列表数据结构有blpop和brpop命令,能从列表里返回且删除第一个(或最后一个)元素,或者被堵塞,直到有一个元素可供操作.这可以用来实现一个简单的队列. (译注:对于blpop和brpop命令,如果列表里没有关键字可供操作,连接将被堵塞,直到有另外的Redis客户端使用lpush或rpush命令推入关键字为止.) 此外,Redis对于消息发布和频道订阅有着一流的支持.你可以打开第二个redis-cli窗口,去尝试一下这些功能.在第一个窗口里订阅一个频道(我们会称它为warnings

Redis订阅发布功能

Redis安装使用 1.下载Redis:http://redis.io/download 2.解压安装: #tar zxf redis-3.0.6.tar.gz #make 3.启动 #cd /usr/local/src/redis-3.0.6 #src/redis-server & 4.检查 5.登陆 #src/redis-cli 6.常用命令  set name 'yangmv'        存数据            get name                        取数

redis的订阅和发布

#订阅和发布有什么用呢?# 特点# 1.实现一个一对多的效果,只有一个发布者,多个订阅者# 2.实时的发布消息,广播方发布消息,所有的订阅者都会受到消息,一个人同时只能接受#一个频道 1.先写一个公共的类,这个类发布方和订阅方都可以调用,我们在这个类中分别定义了发布方的方法和订阅方的方法 import redis class RedisHelper(object): def __init__(self): self.conn = redis.Redis(host="127.0.0.1"

Redis七(发布订阅)

发布与订阅(pub/sub) 介绍 Redis 通过 PUBLISH . SUBSCRIBE 等命令实现了订阅与发布模式, 这个功能提供两种信息机制, 分别是订阅/发布到频道和订阅/发布到模式 订阅者可以订阅一个或多个频道,发布者向一个频道发送消息后,所有订阅这个频道的订阅者都将收到消息,而发布者也将收到一个数值,这个数值是收到消息的订阅者的数量.订阅者只能收到自它开始订阅后发布者所发布的消息,而之前发布的消息是收不到的. 运行原理: Redis 的 SUBSCRIBE 命令可以让客户端订阅任意

Redis中的发布与订阅

redis中实现发布与订阅相对于zookeeper非常简单.直接使用publish和subscribe就行. subscrible news; 订阅news这个channel publish news  a-dog-eat-a-pig 在news这个channel就接受到信息

ServiceStack.Redis订阅发布服务的调用(Z)

1.Redis订阅发布介绍Redis订阅发布是一种消息通信模式:发布者(publisher)发送消息,订阅者(Subscriber)接受消息.类似于设计模式中的观察者模式.发布者和订阅者之间使用频道进行通信,当需要发送消息时,发布者通过publish命令将消息发送到频道上,该消息就会发送给订阅这个频道的订阅者. 图片来自于http://www.runoob.com/redis/redis-pub-sub.html 2.ServiceStack.Redis ServiceStack.Redis是R