当前位置: 首页 > news >正文

redis之发布与订阅

华子目录

  • 什么是发布与订阅?
  • 常用命令
    • `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"

相关文章:

redis之发布与订阅

华子目录 什么是发布与订阅?常用命令psubscribe pattern1 [pattern2...]subscribe channel1 [channel2...]publish channel messagepunsubscribe pattern1 [pattern2...]unsubscribe [channel1 [channel2...]]pubsub subcommand argument1 [argument2...] 示例1示例…...

LLM主流开源代表模型

LLM主流开源大模型介绍 1 LLM主流大模型类别 随着ChatGPT迅速火爆,引发了大模型的时代变革,国内外各大公司也快速跟进生成式AI市场,近百款大模型发布及应用。 目前,市面上已经开源了各种类型的大语言模型,本章节我们…...

Openharmony的usb从框架到hdf驱动流程梳理

​ HDF框架实现了用户层与内核层进行通信的管理框架,关于其简易通信示例在以下两篇博文中有所介绍, 一个例子了解通过Openharmony的HDF框架实现简易驱动的流程https://blog.csdn.net/procedurecode/article/details/128906246 Openharmony的用户态应用通过HDF框架驱动消息机制…...

Apache Doris 基础 -- 数据表设计(数据模型)

Versions: 2.1 1、模型概览 本主题从逻辑角度介绍了Doris中的数据模型,以便您可以在不同的业务场景中更好地使用Doris。 基本概念 本文主要从逻辑的角度描述Doris的数据模型,旨在帮助用户在不同的场景更好地利用Doris。 在Doris中,数据在…...

“雪糕刺客”爆改“红薯刺客”,钟薛高给了消费品牌哪些启示?

夏日袭来,一支价格高昂却让人眼前一亮的雪糕,曾一度成为市场热议的焦点。然而,随着消费者对性价比的日益关注,曾经的“雪糕刺客”钟薛高,其创始人林盛近期以直播带货红薯开启他的还债之路,高打情怀“直播自…...

多输入多输出非线性对象的模型预测控制—Matlab实现

本示例展示了如何在 Simulink 中设计多输入多输出对象的闭环模型预测控制。该对象有三个操纵变量和两个测量输出。 一、非线性对象的线性化 运行该示例需要同时安装 Simulink 和 Simulink Control Design。 % 检查是否同时安装了 Simulink 和 Simulink Control Design if ~m…...

多项分布模拟及 Seaborn 可视化教程

多项分布 简介 多项分布是二项分布的推广,它描述了在 n 次独立试验中,k 种不同事件分别出现次数的离散概率分布。与二项分布只能有两种结果(例如成功/失败)不同,多项分布可以有 k 种(k ≥ 2)及…...

学计算机,我错了吗?

今天,我的一位朋友告诉我,终于找到一家小公司入职,年前 1 月辞职,本想休息一段时间,没成想,休息到 6 月份,现在程序员真的越来越难找工作了。 肯定有人在想,现在这种行情&#xff0…...

学习小心意——简单的循坏语句

for循坏 基本语法格式 for 变量 in 序列:代码块 示例代码如下 for i in range(10):print(i)#输出结果:0 1 2 3 4 5 6 7 8 9 简单案例代码如下 利用for语句遍历序列 # 遍历字符串打印每个字母 for letter in "python":print(letter)# 遍历列表并打印每个元素 a …...

C++ 类方法解析:内外定义、参数、访问控制与静态方法详解

C 类方法 类方法,也称为成员函数,是属于类的函数。它们用于操作或查询类数据,并封装在类定义中。类方法可以分为两种类型: 类内定义方法: 直接在类定义内部声明和定义方法。类外定义方法: 在类定义内部声明方法,并在…...

pytorch+YOLOv8-1

1.工具开发 2.idea配置pytorch环境 默认安装新版本torch pip install torch 3.pytorch验证 4. print(torch.cuda.is_available()) 输出结果为 False 说明我只能用cpu...

JavaScript 基础 - 对象

对象 对象是一种无序的数据集合&#xff0c;可以详细的描述描述某个事物。 注意数组是有序的数据集合。它由属性和方法两部分构成。 语法 声明一个对象类型的变量与之前声明一个数值或字符串类型的变量没有本质上的区别。 <script>let 对象名 {属性名&#xff1a;属性值…...

代码随想录第23天|回溯part3 组合与分割

39.组合总和 class Solution { public:vector<vector<int>> res;vector<int> path;void backTracking(vector<int>& candidates,int target,int sum,int n,int step){if(n > 150) return;if(sum > target) return;if(sum target){res.push_…...

nginx和proxy_protocol协议

目录 1. 引言2. HTTP server的配置3. Stream server的配置3.1 作为proxy_protocol的前端服务器3.2 作为proxy_protocol的后端服务器1. 引言 proxy_protocol 是haproxy开发的一种用于在代理服务器和后端服务器之间传递客户端连接信息的协议。使用 proxy_protocol 的主要优势是能…...

【pytorch】数据转换/增强后保存

数据转换 from PIL import Image from pathlib import Path import matplotlib.pyplot as plt import numpy as npimport torch import torchvision.transforms as Tplt.rcParams["savefig.bbox"] = tight # orig_im...

超越Devin!姚班带队,他们创大模型编程新世界纪录

超越Devin&#xff01;SWEBench排行榜上迎来了新玩家—— StarShip CodeGen Agent&#xff0c;姚班带队初创公司OpenCSG出品&#xff0c;以23.67%的成绩获得全球第二名的成绩。 同时创造了非GPT-4o基模的最高纪录&#xff08;SOTA&#xff09;。 我们都知道&#xff0c;SWEBe…...

江苏大信环境科技有限公司:环保领域的开拓者与引领者

2009 年&#xff0c;江苏大信环境科技有限公司在宜兴环保科技工业园成立。自创立之始&#xff0c;该公司便笃定坚守“诚信为本、以质量求生存、以创新谋发展”这一经营理念&#xff0c;全力以赴为客户构建专业的工业有机废气治理整体解决方案&#xff0c;进而成为国家高新技术企…...

关于 Bean 容器的注入方式,99 % 的人都答不全!

引言&#xff1a;在使用 Spring 框架开发应用程序时&#xff0c;依赖注入是一个至关重要的概念。而对于 Bean 容器的注入方式&#xff0c;虽然我们可能都有一定的了解&#xff0c;但实际上很多人在被问及这个问题时可能并不能完整地回答。本文将深入探讨 Spring 中 Bean 容器的…...

Spring的@Async注解及其用途

Spring 的 Async 注解是 Spring Framework 4.2 版本引入的功能&#xff0c;它用于支持异步方法执行。当一个方法标注了 Async&#xff0c;Spring 会在一个单独的线程中调用该方法&#xff0c;从而不会阻塞主线程的执行。 Async 注解的用途&#xff1a; 提高性能&#xff1a;通…...

JS(DOM、事件)

DOM 概念:Document Object Model&#xff0c;文档对象模型。将标记语言的各个组成部分封装为对应的对象: Document:整个文档对象Element:元素对象Attribute:属性对象Text:文本对象Comment:注释对象 JavaScript通过DOM&#xff0c;就能够对HTML进行操作: 改变 HTML 元素的内…...

GAPSO-LSTM:遗传粒子群优化算法优化LSTM超参数的数据回归预测方法

GAPSO-LSTM&#xff0c;即遗传粒子群优化算法优化LSTM的超参数做数据回归预测&#xff0c;多输入单输出&#xff0c;预测精度高于PSO-LSTM&#xff0c;算法原理为串行GAPSO&#xff0c;PSO的寻优结果再引入高斯变异和个体杂交&#xff0c;可以解决PSO容易陷入局部最优的问题。一…...

学生评教|高校评教|基于SpringBoot+vue高校学生评教系统 (源码+数据库+文档)

高校学生评教系统 目录 基于SpringBootvue高校学生评教系统 一、前言 二、系统设计 三、系统功能设计 1学生功能模块 2管理员功能模块 3老师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&a…...

基于MATLAB的多种概率分布拟合与KS检验:从GEV到Exponential分布选择与实践

11种概率分布的拟合与ks检验&#xff0c;可用于概率分析&#xff0c;可靠度计算等领域 案例中提供11种概率分布&#xff0c;具体包括&#xff1a;gev、logistic、gaussian、tLocationScale、Rayleigh、Loglogistic、Lognormal、GeneralizedPareto、Weibull、Gamma、Exponential…...

知网检测AI率90%,我用这个方法两天降到12%

三月底&#xff0c;距离论文提交还有8天&#xff0c;知网AIGC检测报告出来了&#xff1a;AI率90%。 我当时的反应就是愣在那里。90%&#xff0c;这意味着几乎整篇论文都被标红了。后来用两天时间&#xff0c;把AI率降到了12%。今天把这个过程完整记录下来&#xff0c;因为我知…...

新手怎么部署OpenClaw?2026年本地1分钟超速搭建OpenClaw及大模型百炼APIKey配置

新手怎么部署OpenClaw&#xff1f;2026年本地1分钟超速搭建OpenClaw及大模型百炼APIKey配置。OpenClaw&#xff08;原Clawdbot&#xff09;作为2026年主流的AI自动化助理平台&#xff0c;可通过阿里云轻量服务器实现724小时稳定运行&#xff0c;并快速接入钉钉&#xff0c;让AI…...

抖音无水印视频批量下载全攻略:从痛点解决到高效管理

抖音无水印视频批量下载全攻略&#xff1a;从痛点解决到高效管理 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…...

t3mujinpack胶片模拟技术解析:基于Hald CLUT算法的开源胶片仿真实现

t3mujinpack胶片模拟技术解析&#xff1a;基于Hald CLUT算法的开源胶片仿真实现 【免费下载链接】t3mujinpack Collection of film emulation presets for open-source RAW developer software Darktable. 项目地址: https://gitcode.com/gh_mirrors/t3/t3mujinpack t3m…...

如何用QtScrcpy突破手机操控局限?三大创新方案让多场景效率提升300%

如何用QtScrcpy突破手机操控局限&#xff1f;三大创新方案让多场景效率提升300% 【免费下载链接】QtScrcpy Android real-time display control software 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy 手机屏幕太小导致操作失误&#xff1f;多设备管理切…...

别再乱用ROS2的QoS了!深入DDS底层,搞懂Reliability和Deadline到底怎么选

别再乱用ROS2的QoS了&#xff01;深入DDS底层&#xff0c;搞懂Reliability和Deadline到底怎么选 在机器人系统开发中&#xff0c;数据传输的实时性和可靠性往往是一对难以调和的矛盾。当你的ROS2节点在复杂网络环境中频繁丢包&#xff0c;或者关键控制指令无法及时送达时&…...

Python flask django框架的汽车零件运输管理信息系统设计及实现

目录同行可拿货,招校园代理 ,本人源头供货商功能模块设计技术实现要点高级功能扩展代码示例&#xff08;Flask&#xff09;部署与维护项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 功…...