redis- 发布订阅模式
redis- 发布订阅模式
1.简介
redis发布订阅是一种消息通信模式:发送者发送消息,订阅者接收消息。redis的subscribe命令可以让客户端订阅任意数量的频道,每当有新消息发送到被订阅的频道时,信息就会被发送到所有订阅指定频道的客户端。
2. 发布订阅
2.1 发布订阅的两种模式
redis发布订阅分为两种模式:
- 基于频道的发布订阅
- 基于模式的发布订阅
2.2 基于频道的发布订阅
“发布/订阅"模式包含两种角色,分别是发布者和订阅者。发布者可以向指定的频道发送消息;订阅者可以订阅一个或者多个频道,所有订阅此频道的订阅者都会收到此消息。
2.23 发布者发布消息
发布者发布消息的命令是publish,用法是publish channel message,如 donghua 说一声 hello
这样消息就发出去了。返回值表示接收这条消息的订阅者信息。发出去的消息不会被持久化,也就是客户端订阅donghua后只能接收到后续发布到该频道的消息,之前的接收不到了。
2.24 订阅者订阅频道
订阅频道的命令是subscribe,可以同时订阅多个频道,用法是subscribe channel [channel2 ....],例如新开的一个客户端订阅上面的频道。
2.3 基于模式的发布订阅
2.31 什么是基于模式的发布订阅
如果有某个/某些模式和这个频道匹配的话,那么所有订阅这个/这些频道的客户端也同样会接收到信息。
下面展示了一个带有频道和模式的例子,其中tweet.shop.*模式匹配了tweet.shop.kindle 频道和 tweet.shop.ipad频道,并且有不同的客户端分别订阅了它们三个:
当有消息发送到tweet.shop.kindle频道时,信息除了发送给clientX和clientY之外,还会发送给订阅tweet.shop.* 模式的 client123 和client 256;
另一方面,如果接收到信息的频道tweet.shop.ipad,那么client123和client256同时会收到信息:
2.32 订阅消息
通配符中?表示1个占位符,*表示任意个占位符(包括0),?*表示1个以上占位符。
2.34 发布消息
2.35 注意点
- 使用psubscribe命令可以重复订阅同一个频道,如客户端执行了
psubscribe c? c?*
。这时向c1发布消息客户端会接受到两条消息,而同时publish命令的返回值是2而不是1。同样的,如果有另一个客户端执行了subscribe c1
和psubscribe c?*
的话,向c1发送一条消息该客户顿也会受到两条消息(但是是两种类型:message和pmessage),同时publish命令也返回2. - punsubscribe命令可以退订指定的规则,用法是:
punsubscribe [pattern [pattern ...]]
,如果没有参数则会退订所有规则。 - 使用punsubscribe只能退订通过psubscribe命令订阅的规则,不会影响直接通过subscribe命令订阅的频道;同样unsubscribe命令也不会影响通过psubscribe命令订阅的规则。另外需要注意punsubscribe命令退订某个规则时不会将其中的通配符展开,而是进行严格的字符串匹配,所以
punsubscribe *
无法退订c*
规则,而是必须使用punsubscribe c*
才可以退订。(它们是相互独立的,后文可以看到数据结构上看也是两种实现)
参考链接:https://pdai.tech/md/db/nosql-redis/db-redis-x-pub-sub.html