Redis---订阅和发布

标签:Redis首次发布:2024-01-24最近修改:2026-08-16

消息系统

pubsub_storage_system

​发布/订阅,即 pub/sub,是一种消息通信模式:发布者也称为消息生产者,生产和发送消息到存储系统;订阅者也称为消息消费者,从存储系统接收和消费消息。这个存储系统可以是文件系统 FS、消息中间件 MQ、数据管理系统 DBMS,也可以是 Redis。整个消息发布者、订阅者与存储系统称为消息系统。

​消息系统中的订阅者订阅了某类消息后,只要存储系统中存在该类消息,其就可不断的接收并消费这些消息。当存储系统中没有该消息后,订阅者的接收或消费将会阻塞。而当发布者将消息写入到存储系统后,会立即唤醒订阅者。当存储系统放满时,不同的发布者具有不同的处理方式:有的会阻塞发布者的发布,等待可用的存储空间;有的则会将多余的消息丢失。当然,不同的消息系统消息的发布/订阅方式也是不同的。例如 RocketMQ、Kafka 等消息中间件构成的消息系统中,发布/订阅的消息都是以主题 Topic 分类的。而 Redis 构成的消息系统中,发布/订阅的消息都是以频道 Channel 分类的。

​Redis 的发布与订阅功能可以让客户端通过广播方式,将消息(message)同时发送给可能存在的多个客户端,并且发送消息的客户端不需要知道接收消息的客户端的具体信息。换句话说,发布消息的客户端与接收消息的客户端两者之间没有直接联系。

命令

subscribe:订阅频道

  • 格式:SUBSCRIBE channel [channel1 channel2 ······ ]
  • 功能:Redis 客户端通过一个 subscribe 命令可以同时订阅任意数量的频道。在输出了订阅了主题后,命令处于阻塞状态,等待相关频道的消息。
  • 订阅者:
    bash
    127.0.0.1:6379> subscribe news1) "subscribe"2) "news"3) (integer) 1

publish:向频道发送消息

  • 格式:PUBLISH channel message
  • 功能:Redis 客户端通过一条 publish 命令可以发布一个频道的消息。返回值为接收到该消息的订阅者数量。
  • 发布者:
    bash
    127.0.0.1:6379> publish news "hello world"(integer) 1
  • 订阅者:
    bash
    127.0.0.1:6379> subscribe news1) "subscribe"2) "news"3) (integer) 11) "message"2) "news"3) "hello world"

unsubscribe:退订频道

  • 格式:UNSUBSCRIBE channel [channel1 channel2 ······ ]
  • 功能:Redis 客户端退订指定的频道。
  • 说明:如果没有频道被指定,也就是一个无参数的 UNSUBSCRIBE 命令被执行,那么客户端使用 SUBSCRIBE 命令订阅的所有频道都会被退订。在这种情况下,命令会返回一个信息,告知客户端所有被退订的频道。
注意

redis-cli 在使用 subscribe(订阅频道)和 psubscribe(订阅模式)这写命令后会进入阻塞状态,无法输入其他命令。详见:为什么在 redis-cli 中使用了 subscribe 命令后无法再执行 unsubscribe 等命令

psubscribe:订阅模式

  • 格式:PSUBSCRIBE pattern [pattern1 pattern2 ······ ]

  • 功能:订阅一个或多个符合给定模式的频道。

  • 说明:这里的模式可以是全局通配符 * ,也可以使用选择匹配符 [ ]。例如,news.* 模式可以匹配所有以 news 开头的频道,像 news.music、news.blog、news.sport 等;而 news.[ie]t 模式则可以匹配 news.it 频道和 news.et 频道。

  • 订阅者:

    bash
    # 开始订阅127.0.0.1:6379> psubscribe news.[ie]t1) "psubscribe"2) "news.[ie]t"3) (integer) 1# 收到消息127.0.0.1:6379> psubscribe news.[ie]t1) "psubscribe"2) "news.[ie]t"3) (integer) 11) "pmessage"2) "news.[ie]t"3) "news.it"4) "Go language"1) "pmessage"2) "news.[ie]t"3) "news.et"4) "Java language"
  • 发布者:

    bash
    # 开始发送消息127.0.0.1:6379> publish news.it "Go language"(integer) 1127.0.0.1:6379> publish news.et "Java language"(integer) 1

punsubscribe:退订模式

  • 格式:PUNSUBSCRIBE pattern [pattern1 pattern2 ······ ]
  • 功能:退订一个或多个符合给定模式的频道。
  • 说明:这里的模式可以是全局通配符 * ,也可以使用选择匹配符 [ ]。如果没有频道被指定,其效果与 SUBSCRIBE 命令相同,客户端将退订所有订阅的频道。

pubsub:查看发布与订阅的相关信息

pubsub channels:查看所有被订阅的频道

  • 格式:PUBSUB CHANNELS [pattern]
  • 功能:列出当前所有的活跃频道。活跃频道指的是那些至少有一个订阅者的频道。
  • 说明:pattern 参数是可选的。如果不给出 pattern 参数,将会列出订阅/发布系统中的所有活跃频道。如果给出 pattern 参数,那么只列出和给定模式 pattern 相匹配的那些活跃频道。
    bash
    # 订阅者1订阅 news127.0.0.1:6379> subscribe news1) "subscribe"2) "news"3) (integer) 1# 订阅者2订阅 news.sport127.0.0.1:6379> subscribe news.sport1) "subscribe"2) "news.sport"3) (integer) 1# 查看所有被订阅的频道(另外开一个会话)127.0.0.1:6379> pubsub channels1) "news"2) "news.sport"

pubsub numsub:查看频道的订阅者数量

  • 格式:PUBSUB NUMSUB [channel1 channel2 ······ ]
  • 功能:返回给定频道的订阅者数量。不给定任何频道则返回一个空列表。
    bash
    127.0.0.1:6379> pubsub numsub news1) "news"2) (integer) 1127.0.0.1:6379> pubsub numsub news.sport1) "news.sport"2) (integer) 1

pubsub numpat:查看被订阅模式的总数量

  • 格式:PUBSUB NUMPAT
  • 功能:查询当前 Redis 所有客户端订阅的所有频道模式的数量总和
    bash
    # 发布订阅模式1127.0.0.1:6379> psubscribe news.sport1) "psubscribe"2) "news.sport"3) (integer) 1# 另一个客户端发布订阅模式2127.0.0.1:6379> psubscribe news.music1) "psubscribe"2) "news.music"3) (integer) 1# 查看被订阅模式的总数量127.0.0.1:6379> pubsub numpat(integer) 2

Comments

评论区将在滚动到这里时加载。