• redis之发布与订阅


    什么是发布与订阅?

    • Redis发布订阅(pub/sub)是一种消息通信模式发送者(pub)发送消息订阅者(sub)接受消息。
    • Redis客户端可以订阅任意数量的频道
    • 在这里插入图片描述

    下图展示了频道 channel1 ,以及订阅这个频道的三个客户端 —— client1 、client2 和 client3 之间的关系:
    在这里插入图片描述
    当有新消息通过 publish 命令发送给频道 channel1时, 这个消息就会被发送给订阅它的三个客户端
    在这里插入图片描述

    常用命令

    命令说明
    psubscribe pattern1 [pattern2...]订阅一个或多个符合给定模式的频道
    subscribe channel1 [channel2...]订阅给定的一个或多个频道的信息(即:创建频道
    publish channel message将信息发送到指定的频道
    punsubscribe pattern1 [pattern2...]退订所有给定模式的频道
    unsubscribe [channel1 [channel2...]]退订给定的频道
    pubsub subcommand argument1 [argument2...]查看订阅与发布系统状态

    psubscribe pattern1 [pattern2...]

    • Redis 中,PSUBSCRIBE 命令用于订阅一个或多个模式(pattern),以便当与这些模式匹配的新频道(channel)上有消息发布时客户端能够收到这些消息。

    具体来说,PSUBSCRIBE pattern1 [pattern2 ...] 命令的作用如下:

    • PSUBSCRIBE: 这是 Redis 命令的名称,用于模式订阅。
    • pattern1 [pattern2 ...]: 这些是你要订阅的模式列表。模式通常使用通配符(如 *?)来定义,以便可以匹配多个频道。

    例如:

    1. 假设你有三个频道:chat1, chat2, 和 news.sport
    2. 你想要订阅所有以 chat 开头的频道和所有以 news. 开头的频道。

    你可以使用以下命令:

    PSUBSCRIBE chat* news.*
    
    • 这样,当 chat1chat2 或任何以 news. 开头的频道上有新消息发布时,你的客户端都会收到这些消息。

    • SUBSCRIBE 命令(用于订阅特定的频道)不同,PSUBSCRIBE 允许你基于模式订阅多个频道,这使得你可以更灵活地处理来自多个频道的消息。

    注意:为了接收这些消息,你还需要使用 pmessage 命令(或相关的 Redis 客户端库方法)来读取它们。当你从模式订阅的频道中接收到消息时,这些消息将以 pmessage 的形式发送给你,其中包含了原始的消息内容以及发送消息的频道名称和模式匹配的信息。

    subscribe channel1 [channel2...]

    • Redis 中,SUBSCRIBE 命令用于订阅一个或多个特定的频道(channel)。当你使用 SUBSCRIBE 命令时,你会告诉 Redis 你对某个或多个频道的消息感兴趣,并希望在这些频道上有新消息发布时能够收到通知。

    具体来说,SUBSCRIBE channel1 [channel2 ...] 命令的作用如下:

    • SUBSCRIBE: 这是 Redis 命令的名称,用于频道订阅。
    • channel1 [channel2 ...]: 这些是你要订阅的频道列表。每个频道都是一个字符串,表示一个特定的消息传递通道。

    例如,假设你有三个频道:news, weather, 和 stock。如果你只对 newsweather 频道的消息感兴趣,你可以使用以下命令来订阅它们:

    SUBSCRIBE news weather
    
    • 一旦你订阅了这些频道,当这些频道上有新消息发布时,Redis 就会将消息发送给你的客户端。

    • 当你收到消息时,它们会以 message 的形式发送给你,其中包含了原始的消息内容以及发送消息的频道名称。你可以使用 Redis 客户端库提供的方法来读取这些消息。

    publish channel message

    • Redis 中,PUBLISH 命令用于向指定的频道(channel)发布消息。当消息被发布到某个频道时所有订阅了该频道的客户端都会收到该消息

    具体来说,PUBLISH channel message 命令的作用如下:

    • PUBLISH: 这是 Redis 命令的名称,用于发布消息。
    • channel: 这是你要发布消息的频道的名称。它是一个字符串,表示一个特定的消息传递通道。
    • message: 这是你要发布的消息的内容。它也是一个字符串,可以包含任何你想要发送的数据。

    例如,假设你有一个名为 news 的频道,并且你想要向该频道发布一条包含最新新闻的消息。你可以使用以下命令:

    PUBLISH news "Latest news: The stock market is up today!"
    
    • 这条命令会将字符串 "Latest news: The stock market is up today!" 发布到名为 news 的频道上。所有订阅了该频道的客户端都会立即收到这条消息。

    • 需要注意的是,如果没有任何客户端订阅了指定的频道,那么发布的消息将不会被存储或转发给任何客户端。此外,如果频道名称不存在,Redis 也会将其视为一个有效的频道并尝试发布消息,但如果没有客户端订阅该频道,则消息将被丢弃。

    punsubscribe pattern1 [pattern2...]

    • PUNSUBSCRIBE 命令中,你可以指定一个或多个模式来取消订阅。例如:
    PUNSUBSCRIBE pattern1 pattern2
    

    最后,如果你只是想要取消对某个特定频道的订阅(而不是基于模式的订阅),你可以使用 UNSUBSCRIBE 命令:

    UNSUBSCRIBE channel1
    

    这将取消对名为 channel1 的频道的订阅。

    unsubscribe [channel1 [channel2...]]

    • 确实,UNSUBSCRIBERedis 中用于取消订阅一个或多个频道的命令。当你使用 SUBSCRIBE 命令订阅了一个或多个频道后,你可以使用 UNSUBSCRIBE 命令来停止接收这些频道上的消息。

    具体语法是:

    UNSUBSCRIBE [channel [channel ...]]
    
    • UNSUBSCRIBE: 这是 Redis命令的名称,用于取消订阅频道。
    • channel [channel ...]: 这些是你要取消订阅的频道名称。你可以指定一个或多个频道名称,用空格分隔。如果你不提供任何频道名称,Redis 会取消客户端对所有频道的订阅。

    例如,如果你之前订阅了 newsweather 两个频道,现在只想取消对 news 频道的订阅,你可以使用以下命令:

    UNSUBSCRIBE news
    

    如果你想要取消对所有频道的订阅,只需运行 UNSUBSCRIBE 命令而不带任何参数:

    UNSUBSCRIBE
    

    执行 UNSUBSCRIBE 命令后,你将不再接收指定频道上的任何新消息。如果你之后想要重新订阅这些频道,你需要再次使用 SUBSCRIBE 命令。

    pubsub subcommand argument1 [argument2...]

    • Redis 中,PUBSUB 命令用于查看订阅与发布系统的状态,它并不是一个用于发布或订阅消息的命令,而是用于查询与发布/订阅相关的信息PUBSUB 命令后面跟的 subcommand 决定了查询的具体内容,而 argument1 [argument2...] 是与 subcommand 相关的参数。

    RedisPUBSUB 命令支持以下子命令(subcommand):

    1. PUBSUB channels [pattern]: 列出当前服务器中所有活跃的频道,如果提供了 pattern 参数,则只列出与模式匹配的频道。

    2. PUBSUB numpat: 返回客户端当前订阅的模式数量。

    3. PUBSUB numsub [channel1 channel2 ... ]: 返回指定频道当前的订阅者数量。如果没有指定频道,则返回所有频道的订阅者数量。

    下面是一些使用 PUBSUB 命令的例子:

    1. 列出所有活跃的频道(假设没有任何模式匹配):

      127.0.0.1:6379> pubsub channels
      
    2. 列出与模式 chat* 匹配的频道:

      127.0.0.1:6379> pubsub channels chat*
      
    3. 返回客户端当前订阅的模式数量:

      127.0.0.1:6379> pubsub numpat
      
    4. 返回频道 newsweather 的订阅者数量:

      127.0.0.1:6379> pubsub numsub news weather
      

    请注意,PUBSUB 命令主要用于调试和监控,而不是用于常规的发布/订阅操作。如果你想要发布消息到某个频道,应该使用 PUBLISH 命令;如果你想要订阅某个频道或模式,应该使用 SUBSCRIBEPSUBSCRIBE 命令。

    示例1

    • Redis 中,订阅(subscribe)和发布(publish)是基于发布/订阅(pub/sub)模式的。在这种模式下,发布者(publisher)发送消息到特定的频道(channel),而订阅者(subscriber)则监听这些频道并接收发布的消息。

    要创建一个 Redis 订阅,你需要使用 Redis 的客户端库或命令行工具。以下是使用 Redis 命令行工具进行订阅的基本步骤:

    1. 启动 Redis 客户端

    打开命令行或终端,并启动 Redis 客户端。如果你已经配置了 Redis 服务器并正在运行,你可以简单地键入 redis-cli 来启动客户端。
    2. 订阅频道

    使用 subscribe 命令来订阅一个或多个频道。例如,要订阅名为 mychannel 的频道,你可以输入:

    127.0.0.1:6379> subscribe mychannel1 mychannel2
    

    Redis 客户端会返回一个确认消息,告诉你已经成功订阅了该频道,并等待接收消息。
    3. 在另一个 Redis 客户端或程序中发布消息

    同时,在另一个 Redis 客户端或程序中,你可以使用 PUBLISH 命令向该频道发布消息。例如:

    127.0.0.1:6379> publish mychannel1 "Hello, Redis subscribers!"
    

    所有订阅了 mychannel 的客户端都会收到这条消息。
    4. 接收消息

    回到你之前订阅的 Redis 客户端,你会看到类似以下的输出:

    1) "subscribe"
    2) "mychannel"
    3) (integer) 1
    1) "message"
    2) "mychannel"
    3) "Hello, Redis subscribers!"
    
    • 第一行是确认你已经订阅了 mychannel 的消息。接下来的行是接收到的实际消息,包括频道名和消息内容。
    1. 取消订阅

    要取消订阅并退出监听模式,你可以使用 UNSUBSCRIBE 命令。例如,要取消订阅 mychannel 并退出监听模式,你可以输入:

    127.0.0.1:6379> unsubscribe mychannel2
    1) "unsubscribe"
    2) "mychannel2"
    3) (integer) 0
    

    或者,如果你想要取消订阅所有频道并退出监听模式,只需输入:

    127.0.0.1:6379> unsubscribe
    1) "unsubscribe"
    2) (nil)
    3) (integer) 0
    
    • 查看订阅状态
    127.0.0.1:6379> pubsub channels   #查看所有订阅
    1) "mychannel2"
    2) "mychannel1"
    
    • 查看订阅数量
    127.0.0.1:6379> pubsub numpat
    (integer) 2
    
    • 返回指定频道当前的订阅者数量
    127.0.0.1:6379> pubsub numsub mychannel1 mychannel2
    1) "mychannel1"
    2) (integer) 1
    3) "mychannel2"
    4) (integer) 1
    

    示例2

    以下实例演示了发布订阅是如何工作的。在我们实例中我们创建了订阅频道名为 redisChat:

    127.0.0.1:6379> SUBSCRIBE redisChat
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "redisChat"
    3) (integer) 1
    

    现在,我们先重新开启个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息。

    127.0.0.1:6379> PUBLISH redisChat "send message"
    (integer) 1
    127.0.0.1:6379> PUBLISH redisChat "hello world"
    (integer) 1
    

    然后切换到前一个客户端,就可以看到如下信息:

    127.0.0.1:6379> SUBSCRIBE redisChat
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "redisChat"
    3) (integer) 1
    # 订阅者的客户端显示如下
    1) "message"
    2) "redisChat"
    3) "send message"
    1) "message"
    2) "redisChat"
    3) "hello world"
    
  • 相关阅读:
    解读《互联网政务应用安全管理规定》网络和数据安全中的身份认证和审计合规建设
    python08_函数练习
    golang gin框架1——简单案例以及api版本控制
    C++中的单例模式
    俄罗斯方块游戏开发教程7:消除判断和处理
    【JAVASE】String类
    Gbase数据库
    安装配置Redis
    Web前端开发技术课程大作业——HTML5旅游景区景点(13页面)HTML+CSS+JavaScript
    acwing算法提高之图论--拓扑排序
  • 原文地址:https://blog.csdn.net/huaz_md/article/details/139414905