目录

redis- 发布订阅模式

李羽秋
李羽秋 2022年04月04日  ·  阅读 1,252

redis- 发布订阅模式

1.简介

redis发布订阅是一种消息通信模式:发送者发送消息,订阅者接收消息。redis的subscribe命令可以让客户端订阅任意数量的频道,每当有新消息发送到被订阅的频道时,信息就会被发送到所有订阅指定频道的客户端。

2. 发布订阅

2.1 发布订阅的两种模式

redis发布订阅分为两种模式:

  • 基于频道的发布订阅
  • 基于模式的发布订阅

2.2 基于频道的发布订阅

“发布/订阅"模式包含两种角色,分别是发布者和订阅者。发布者可以向指定的频道发送消息;订阅者可以订阅一个或者多个频道,所有订阅此频道的订阅者都会收到此消息。

image-20220404123231473

2.23 发布者发布消息

发布者发布消息的命令是publish,用法是publish channel message,如 donghua 说一声 hello

image-20220404124059688

这样消息就发出去了。返回值表示接收这条消息的订阅者信息。发出去的消息不会被持久化,也就是客户端订阅donghua后只能接收到后续发布到该频道的消息,之前的接收不到了。

2.24 订阅者订阅频道

订阅频道的命令是subscribe,可以同时订阅多个频道,用法是subscribe channel [channel2 ....],例如新开的一个客户端订阅上面的频道。

image-20220404124535789

2.3 基于模式的发布订阅

2.31 什么是基于模式的发布订阅

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

下面展示了一个带有频道和模式的例子,其中tweet.shop.*模式匹配了tweet.shop.kindle 频道和 tweet.shop.ipad频道,并且有不同的客户端分别订阅了它们三个:

image-20220404125333426

当有消息发送到tweet.shop.kindle频道时,信息除了发送给clientX和clientY之外,还会发送给订阅tweet.shop.* 模式的 client123 和client 256;

image-20220404125519463

另一方面,如果接收到信息的频道tweet.shop.ipad,那么client123和client256同时会收到信息:

image-20220404125835326

2.32 订阅消息

通配符中?表示1个占位符,*表示任意个占位符(包括0),?*表示1个以上占位符。

image-20220404130244554

2.34 发布消息

image-20220404130727158

2.35 注意点

  • 使用psubscribe命令可以重复订阅同一个频道,如客户端执行了psubscribe c? c?*。这时向c1发布消息客户端会接受到两条消息,而同时publish命令的返回值是2而不是1。同样的,如果有另一个客户端执行了subscribe c1psubscribe 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

分类: redis
标签: