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"

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

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

相关文章

ESP使用巴法云远程OTA(VScode + Platform io)

ESP使用巴法云远程OTA(Platform) 什么是OTA: OTA(Over-the-AirTechnology)即空中下载技术,是通过移动通信的空中接口实现对移动终端设备及SIM卡数据进行远程管理的技术。OTA升级是物联网(IOT&am…

如何使用前端表格控件实现多数据源整合?

前言 作为表格产品的典型应用场景之一,几乎所有的行业都会存在类 Excel 报表开发这样的应用场景,而在这些应用场景中,经常会遇见下面的这些痛点: 报表数据往往来自多个不同的数据源,需要报表系统能够同时连接多个数据源…

Vue——模板引用(不建议使用,了解)

文章目录 前言测试案例 前言 模板引用,在官方文档中也有很详细的描述。 虽然 Vue 的声明性渲染模型为你抽象了大部分对 DOM 的直接操作,但在某些情况下,我们仍然需要直接访问底层 DOM 元素。 个人理解为: 在vue中,依据…

STL容器--list

1. list的介绍及使用 1.1 list的介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指其前…

面试官:对于MQ中的消息丢失你是如何理解的?

相信很多的小伙伴在面试的时候,涉及到MQ的面试题,消息丢失是必问面试题之一。那么对于消息丢失你又是如何理解的呢? 下面我们一起来看一下。 本文以 Kafka 举例说明 一、什么是消息丢失? 消息丢失的定义是:在消息传递…

【动手学深度学习】softmax回归从零开始实现的研究详情

目录 🌊1. 研究目的 🌊2. 研究准备 🌊3. 研究内容 🌍3.1 softmax回归的从零开始实现 🌍3.2 基础练习 🌊4. 研究体会 🌊1. 研究目的 理解softmax回归的原理和基本实现方式;学习…

Python打印当前目录下,所有文件名的首字母

代码如下: #!/usr/bin/env python3 """ 按顺序打印当前目录下,所有文件名的首字母(忽略大小写) """ import sys from pathlib import Pathdef main() -> None:ps Path(__file__).parent.glob(…

代码随想录算法训练营第26天(py)| 回溯 | 39. 组合总和、40.组合总和II、131.分割回文串

39. 组合总和 力扣链接 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明: 所有数字(包括 target)都是正整数…

上传RKP 证书签名请求息上传到 Google 的后端服务器

上传证书签名请求 1.准备环境:OK pip3 install google-auth2.13.0 requests2.28下载 device_info_uploader.py 。 没找到先跳过 选项 1:通过 GCP 帐户使用 device_info_uploader.py 运行脚本。 ./device_info_uploader.py --credentials /secure/s…

NFS服务p.2 用户的上传与下载,以及用户映射

如何进行上传和下载呢? 目录 如何进行上传和下载呢? 上传 访问时的账户映射对于上传文件和下载文件的影响? 在服务器里进行修改用户的权限 如和修改使用用户上传时的名字? 上传 上传的话,因为我们现在所在的nfs1…

端午佳节到,礼轻情意重,闪侠惠递帮你高效便宜寄快递

马上就是端午佳节了,我们通常会吃粽子,赛龙舟,但是这些礼物我们该怎么快速的送到我们亲朋好友的手中呢?小编这里非常推荐大家使用闪侠惠递来寄快递。不仅能高效便捷的把礼物送到你的手中,而且还能以非常便宜的价格呢&a…

03_初识Spring Cloud Gateway

文章目录 一、网关简介1.1 网关提出的背景1.2 网关在微服务中的位置1.3 网关的技术选型1.4 补充 二、Spring Cloud Gateway的简介2.1 核心概念:路由(Route)2.2 核心概念:断言(Predicate)2.3 核心概念&#…

linux系统——性能检测工具glances

在linux系统中,由python开发的glances工具是一个功能强大的性能检测工具 可以通过yum进行安装 安装glances后,进入命令界面 glance支持网站模式,将监控到的数据以网站形式显示出来 这里需要用python包管理命令 使用glances -w开放…

linux中最基础使用的命令

小白学习记录: 前情提要:Linux命令基础格式!查看 ls看目录的小技巧 进入指定目录 cd查看当前工作目录 pwd创建一个新的目录(文件夹) mkdir创建文件 touch查看文件内容 cat、more操作文件、文件夹- 复制 cp- 移动 mv- 删除【危险操作&#xff…

PostgreSQL 远程登录postgres用户不需要密码?免密登录权限设置

PostgreSQL 安装之后,发现登录postgres用户时不需要密码。原因配置远程IP时,IP 地址对应的 method 设置成了 trust。 今天安全测试反馈,pgsql有弱口令问题,于是上去改了pgsql的密码,结果问题还没解决。查看了具体的问…

docker运行centos提示Operation not permitted

1、在docker中运行了centos7镜像 2、进入到centos容器中使用systemctl命令时提示 systemctl Failed to get D-Bus connection: Operation not permitted 3、解决办法 在运行centos镜像的时候加上--privileged参数 4、附上docker官网命令说明截图

OpenHarmony父子组件单项同步使用:@Prop装饰器

Prop装饰的变量可以和父组件建立单向的同步关系。Prop装饰的变量是可变的,但是变化不会同步回其父组件。 说明: 从API version 9开始,该装饰器支持在ArkTS卡片中使用。 概述 Prop装饰的变量和父组件建立单向的同步关系: ● P…

C语言(数据存储)

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记,在这里撰写成文一…

贪心,CF802B. Heidi and Library

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 802A - Codeforces 二、解题报告 1、思路分析 这个题相当于你有一个容量为K的Cache,然后给你一系列访存序列 当访问缺失时你不得不替换掉Cache中某些块 学过操作系统都很熟悉页面置…