redis 订阅与发布

  • PUBLISH,SUBSCRIBE,等命令实现订阅与发布

    • 订阅/发布到频道
    • 订阅/发布到模式

频道的订阅与信息发送


 

订阅subscribe,可以让客户端订阅任意数量的频道,

每当有新信息发送到被订阅的频道时,信息就会被发送给所有订阅指定频道的客户端:

当有新消息通过publish命令发送给频道channel1时,这个消息就会被发送给订阅它的三个客户端:

订阅频道

每个 Redis 服务器进程都维持着一个表示服务器状态的 redis.h/redisServer 结构,结构的

pubsub_channels 属性是一个字典,这个字典就用于保存订阅频道的信息:

struct redisServer {
// ...
dict *pubsub_channels;
// ...
};

  

其中字典的键为正在被订阅的频道,而字典的值则是一个链表,链表中保存了所有订阅这个频道的客户端。

例如:

当客户端调用subscribe命令时,程序将客户端和要订阅的频道在pubsub_channels字典中关联起来。

举个例子,如果客户端 client10086 执行命令 SUBSCRIBE channel1 channel2 channel3 ,

那么前面展示的 pubsub_channels 将变成下面这个样子:

发送信息到频道

当调用 PUBLISH channel message 命令,程序首先根据 channel 定位到字典的键,然后将信息发

送给字典值链表中的所有客户端。

如果某个客户端执行命令

PUBLISH channel1 "hello moto" ,上图中那么 client2 、 client5 ,client1,client10086 4个客户端都将接收到 "hello moto"

退订频道

UNSUBSCRIBE 命令可以退订指定的频道, 它从pubsub_channels 字典的给定频道(键)中,删除关于当前客户端的信息,这样被退订频道的信息就不会再发送给这个客户端。

模式的订阅与信息发送


当使用 PUBLISH 命令发送信息到某个频道时,不仅所有订阅该频道的客户端会收到信息,如

果有某个/某些模式和这个频道匹配的话,那么所有订阅这个/这些频道的客户端也同样会收到

信息。

带频道和模式的例子, 其中 tweet.shop.* 模式匹配了 tweet.shop.kindle

频道和 tweet.shop.ipad 频道,并且有不同的客户端分别订阅它们三个:

当有信息发送到 tweet.shop.kindle 频道时,信息除了发送给 clientX 和 clientY 之外,还

会发送给订阅 tweet.shop.* 模式的 client123 和 client256 :

订阅模式

redisServer.pubsub_patterns 属性是一个链表,链表中保存着所有和模式相关的信息:

struct redisServer {
     // ...
     list *pubsub_patterns;
     // ...
};

  

链表中的每个节点都包含一个 redis.h/pubsubPattern 结构:

typedef struct pubsubPattern {
     redisClient *client;
     robj *pattern;
} pubsubPattern;

  

client 属性保存着订阅模式的客户端,而 pattern 属性则保存着被订阅的模式。

每当调用 PSUBSCRIBE 命令订阅一个模式时,程序就创建一个包含客户端信息和被订阅模式的

pubsubPattern 结构,并将该结构添加到 redisServer.pubsub_patterns 链表中。

如果这时客户端 client10086 执行 PSUBSCRIBE broadcast.list.* ,那么 pubsub_patterns

链表将被更新成这样:

通过遍历整个 pubsub_patterns 链表,程序可以检查所有正在被订阅的模式,以及订阅这些模式的客户端。

发送信息到模式

发送信息到模式的工作也是由 PUBLISH 命令进行的,在前面讲解频道的时候,我们给出了这

样一段伪代码,说它定义了 PUBLISH 命令的行为:

def PUBLISH(channel, message):

     # 遍历所有订阅频道 channel 的客户端
     for client in server.pubsub_channels[channel]:

          # 将信息发送给它们
          send_message(client, message)

     # 取出所有模式,以及订阅模式的客户端
     for pattern, client in server.pubsub_patterns:

          # 如果 channel 和模式匹配
          if match(channel, pattern):

               # 那么也将信息发给订阅这个模式的客户端
               send_message(client, message)

  

退订模式

使用 PUNSUBSCRIBE 命令可以退订指定的模式,这个命令执行的是订阅模式的反操作:程序

会删除 redisServer.pubsub_patterns 链表中,所有和被退订模式相关联的 pubsubPattern

结构,这样客户端就不会再收到和模式相匹配的频道发来的信息。

小结

  • 订阅信息由服务器进程维持的 redisServer.pubsub_channels 字典保存,

    • 字典的键为被订阅的频道,字典的值为订阅频道的所有客户端。
  • 当有新消息发送到频道时,程序遍历频道(键)所对应的(值)所有客户端,
    • 然后将消息发送到所有订阅频道的客户端上。
  • 订阅模式的信息由服务器进程维持的 redisServer.pubsub_patterns 链表保存,
    • 链表的每个节点都保存着一个pubsubPattern结构,结构中保存着被订阅的模式,
    • 以及订阅该模式的客户端。程序通过遍历链表来查找某个频道是否和某个模式匹配。
  • 当有新消息发送到频道时,除了订阅频道的客户端会收到消息之外,
    • 所有订阅了匹配频、道的模式的客户端,也同样会收到消息。
  • 退订频道和退订模式分别是订阅频道和订阅模式的反操作。
时间: 2024-11-11 22:35:27

redis 订阅与发布的相关文章

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

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

Redis订阅与发布

发布与订阅模型在许多编程语言中都有实现,也就是我们经常说的设计模式中的一种--观察者模式.在一些应用场合,例如发送方并不是以固定频率发送消息,如果接收方频繁去咨询发送方,这种操作无疑是很麻烦并且不友好的. 举个生活的例子,一个喜欢购买鲜牛奶的人,需要每天在上班的时候/下班的时候都专门去牛奶店购买鲜牛奶,但不一定每天去到那里都刚好有自己喜欢的那一种牛奶,这个时候,这个人跑老远的距离都白费了.但如果这个人去牛奶店一次性订阅了一个月的某种牛奶,那么他就不用担忧今天是否能买到鲜牛奶了,只要送奶员把牛奶送

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