redis之发布与订阅

news2024/11/26 2:51:43

华子目录

  • 什么是发布与订阅?
  • 常用命令
    • `psubscribe pattern1 [pattern2...]`
    • `subscribe channel1 [channel2...]`
    • `publish channel message`
    • `punsubscribe pattern1 [pattern2...]`
    • `unsubscribe [channel1 [channel2...]]`
    • `pubsub subcommand argument1 [argument2...]`
  • 示例1
  • 示例2

什么是发布与订阅?

  • 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"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1795622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVAEE之网络初识_协议、TCP/IP网络模型、封装、分用

前言 在这一节我们简单介绍一下网络的发展 一、通信网络基础 网络互连的目的是进行网络通信,也即是网络数据传输,更具体一点,是网络主机中的不同进程间,基于网络传输数据。那么,在组建的网络中,如何判断到…

MicroPython教程:ESP8266 快速参考

ESP8266 快速参考 Adafruit Feather HUZZAH 板(图片来源:Adafruit)。 以下是基于 ESP8266 的开发板的快速参考。如果这是您第一次使用该板,请考虑先阅读以下部分: 关于 ESP8266 端口的一般信息ESP8266 的 MicroPytho…

大中小面积紫外光老化加速试验机装置

高低温试验箱,振动试验台,紫外老化试验箱,氙灯老化试验箱,沙尘试验箱,箱式淋雨试验箱,臭氧老化试验箱,换气老化试验箱,电热鼓风干燥箱,真空干燥箱,超声波清洗机,盐雾试验箱 一、产品用途 紫外光加速老化试验装置采用荧光紫外灯为光源,通过模拟自然阳光中…

使用wireshark分析tcp握手过程

开启抓包 tcpdump -i any host 127.0.0.1 and port 123 -w tcp_capture.pcap 使用telnet模拟tcp连接 telnet 127.0.0.1 123 如果地址无法连接,则会一直重试SYN包,各个平台SYN重试间隔并不一致,如下: 异常站点抓包展示&#xff…

mmdetection的生物图像实例分割二:自定义数据集注册与模型训练

mmdetection的生物图像实例分割全流程记录 第二章 自定义数据集注册与模型训练 文章目录 mmdetection的生物图像实例分割全流程记录前言一、数据集的注册1.数据集的基本信息引入2.数据集base路径的更改3.数据集的评估 二、配置文件更改1.数据集任务配置2.模型配置3.训练过程配…

恭喜!Z医生喜提世界顶级梅奥诊所访问学者邀请函

➡️【院校简介】 梅奥诊所(Mayo clinic),于1863年在美国明尼苏达州罗彻斯特创立,是全球规模最大的综合性非营利医生执业组织。它是以不断创新的医学教育和世界领先的医学研究为基础,建立起来的全美规模最大、设备最先…

基于 Amazon EC2 快速部署 Stable Diffusion WebUI + chilloutmax 模型

自2023年以来,AI绘图已经从兴趣娱乐逐渐步入实际应用,在众多的模型中,作为闪耀的一颗明星,Stable diffusion已经成为当前最多人使用且效果最好的开源AI绘图软件之一。Stable Diffusion Web UI 是由AUTOMATIC1111 开发的基于 Stabl…

flutter3-os:基于flutter3.x+dart3+getx手机版os管理系统

flutter3-os-admin跨平台手机后台OS系统。 原创Flutter3.22Dart3.4Getxfl_chart等技术开发仿ios手机桌面OA管理系统。自研栅格化布局引擎、自定义桌面壁纸、小部件、底部Dock菜单、可拖拽悬浮球等功能。 全新自研栅格化OS菜单布局引擎。 使用技术 编辑器:VScode技术…

Datetime,一个 Python 的时间掌控者

大家好!我是爱摸鱼的小鸿,关注我,收看每期的编程干货。 一个简单的库,也许能够开启我们的智慧之门, 一个普通的方法,也许能在危急时刻挽救我们于水深火热, 一个新颖的思维方式,也许能…

NMF算法

1. NMF算法 NMF算法,即非负矩阵分解,是一种无监督学习算法,主要用于数据降维和特征提取,特别是在数据元素具有非负性约束的情况下。 NMF是一种数据降维模型,它的基本模型是通过矩阵分解将非负数据转换到新的空间&…

性能测试和功能测试有什么区别吗?

性能测试和功能测试是软件测试中两个不同的概念和方法。尽管它们都是为了提高软件质量和健壮性而进行的测试,但它们关注的方面和方法却不同。下面我将详细介绍性能测试和功能测试的区别。 一、定义和目的 性能测试是测试软件系统在不同条件下的性能和响应能力&…

微软新AI工具 Recall 被白帽公开锤了?

近日,一些网络安全研究人员演示了恶意软件是如何成功窃取 Windows Recall 工具收集到的数据。 2024年5月21日,微软发布全新的“CopilotPC”,这类 AI PC 通过与高通的最新芯片合作,实现了一个叫做“Recall”的功能。借助这个人工智…

lnmp平台部署web应用,安装Discuz社区平台详细文章——更新中

Nginx网站service 详细相关介绍-特点-http状态码-配置文件、将nginx添加永久环境变量 访问网站404是什么?_nginx 稳定版-CSDN博客文章浏览阅读1.2k次,点赞33次,收藏24次。开源Web服务器软件。_nginx 稳定版https://blog.csdn.net/2301_771619…

mmdetection的生物图像实例分割三:自定义数据集的测试与分析

mmdetection的生物图像实例分割全流程记录 第三章 自定义数据集的测试、重建与分析 文章目录 mmdetection的生物图像实例分割全流程记录前言一、测试集的推理1.模型测试2.测试数据解析 二、测试结果的数据整合三、生物结构的重建效果 前言 mmdetection是一个比较容易入门且上…

MySQL Doublewrite Buffer 有了解过吗?

引言:在数据库管理中,确保数据的完整性和一致性是至关重要的。然而,在持久化数据到磁盘的过程中,可能会遇到各种意外情况,如断电或系统崩溃,从而导致部分数据写入,而另一部分数据未能成功写入&a…

eclipse怎么导入python项目

python项目导入eclipse的步骤: 1、首先,打开Eclipse集成开发程序,在菜单栏上点击“File(F)”,在弹出来的列表中点击“导入(I)...”。 2、在弹出来的“导入”窗口中,选择“常规”选项中的“现有…

QT学习过程中遇到的问题自记

文章目录 前言问题1问题2问题3 前言 学习QT嵌入式实战开发(从串口通信到JSON通信微课视频版)的过程中遇到的几个小问题 问题1 1.将书中的示例代码导入自己的电脑,然后点击工程进去,不能运行,报错 no kits are enabled for this project… 我…

[数据集][目标检测]数据集VOC格式岸边垂钓钓鱼fishing目标检测数据集-4330张

数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):4330 标注数量(xml文件个数):4330 标注类别数:1 标注类别名称:["fishing"] 每…

小程序自定义marker弹出框教程

需求背景 微信小程序开发,需要使用腾讯地图显示自定义marker,并且点击marker后弹出自定义的customCallout,并且customCallout的内容为用户点击marker的时候再从后台接口获取数据。 百度了一圈后发现居然没有一篇文章可以一次性完成&#xf…