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"

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C/C++动态内存管理(new与delete)

目录 1. 一图搞懂C/C的内存分布 2. 存在动态内存分配的原因 3. C语言中的动态内存管理方式 4. C内存管理方式 4.1 new/delete操作内置类型 4.2 new/delete操作自定义类型 1. 一图搞懂C/C的内存分布 说明: 1. 栈区(stack):在…

微信视频号上是怎么开店铺的?从入驻到发货,具体流程来了!

这两年,视频号逐渐走入大家视野 单价高,商家又少,很多类目都属于空白无商家入驻阶段,于是好多商家,都准备去视频号小店这个新“黑马”发展发展 那视频号是怎么开店卖东西的?今天我就来给大家分享一下&…

list~模拟实现

目录 list的介绍及使用 list的底层结构 节点类的实现 list的实现 构造函数 拷贝构造 方法一:方法二: 析构函数 赋值重载 insert / erase push_/pop_(尾插/尾删/头插/头删) begin和end(在已建立迭代器的基础上) 迭代…

“神经网络之父”和“深度学习鼻祖”Geoffrey Hinton

“神经网络之父”和“深度学习鼻祖”Geoffrey Hinton在神经网络领域数十年如一日的研究,对深度学习的推动和贡献显著。 一、早期贡献与突破 反向传播算法的引入:Hinton是将反向传播(Backpropagation)算法引入多层神经网络训练的…

客观评价一下GPT-4o

评价GPT-4o(即OpenAI发布的升级版语言模型),以下是上大学网(www.sdaxue.com)从技术能力与创新性、性能与效率、功能实用性与用户体验等几个维度进行评价,不周之出,请大家指正。 技术能力与创新性…

百万总奖池 | 浦源大模型挑战赛(夏季赛)·安全可信赛道正式启动!

随着技术的不断进步,人工智能技术正迅速成为促进社会进步的新质生产力,大模型也成为了“炙手可热”的日常工具,彻底改变了我们与信息之间的互动方式。 然而,随着大模型能力的日益增强,其潜在的风险也日渐凸显&#xf…

网络编程(七)

网络编程(七) UNIX域套接字(本地间进程间通信的技术)(S文件)基于TCP传输基于UDP传输 UNIX域套接字(本地间进程间通信的技术)(S文件) socket同样也可以用于本…

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

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

计算机网络(网络原理及引用)之路由器的基本配置(详细~)

实验目的 熟悉路由各接口的外观、接口的功能、接口的表示方法;掌握带外的管理方法:通过接口console配置;掌握带内的管理方法:通过方式telnet配置;掌握带内的管理方法:通过方式web配置; 路由器…

i.MX8MP平台开发分享(GPC控制器篇)

1.概述 整体来说,i.MX8MP中的电源是由General Power Controller (GPC) 来控制的。GPC可以提供各种电源模式的控制,如低功耗模式、深度睡眠模式等等。GPC包含两个模块,一个是系统模式控制器(SMC),控制系统的…

项目优化方案之---实现邮箱用户登录

之前的项目中我写的基于SpringBoot和Vue的全栈项目已经实现了基本的用户接口开发, 不过其代码的功能单一,而且写的也是有不少漏洞(基本就像刚接手的代码*山一样) 那之后的几篇文章都来分享一下如何优化项目(每一章都独…

【数据结构】链式二叉树(超详细)

文章目录 前言二叉树的链式结构二叉树的遍历方式二叉树的深度优先遍历前序遍历(先根遍历)中序遍历(中根遍历)后序遍历(后根遍历) 二叉树的广度优先遍历层序遍历 二叉树链式结构接口实现二叉树结点个数二叉树叶子结点个数二叉树的深度(高度)二叉树第k层结…

植物大战僵尸杂交版下载链接

前言 植物大战僵尸杂交版是 潜艇伟伟迷 制作并免费向大家开放畅玩并且持续更新关卡。 下载教程 1.打开作者主页:https://space.bilibili.com/97213827/dynamic 2.作者置顶发布的是最新版,直接打开链接安装就好了 3.下载链接:https://pan.qu…

DL-33G电流继电器 新型导轨安装 JOSEF约瑟

用途 DL-30系列电流继电器,用于电机、变压器和输电线的过负荷和短路保护线路中,作为起动元件。 技术参数 按整定值的范围来分:每整定值的动作误差不大于6% 继电器刻度极限误差不大于6%。 动作值的变差不大于6% 对于DL-31、32、33、34电流继电器的返…

【第3章】SpringBoot实战篇之登录接口(含JWT和拦截器)

文章目录 前言一、JWT1. 什么是JWT2. 使用场景3. 结构3.1 Header3.2 Payload3.3 Signature 4. 使用 二、案例1.引入库2.JwtUtils3. UserController14. ArticleController 三、拦截器1. 定义拦截器2. 注册拦截器 四、测试1. 登录2. 无token3. 有token4. 全局配置 总结 前言 前面…

vscode怎么点击路径直接跳转对应文件

在vue项目中经常要引入工具类、组件、模版等,想要直接去看对应文件,只能自己找到对应路径再去打开。 我们可用在js项目中创建一个 jsconfig.json文件,TS项目可以创建tsconfig.json 文件代码 {"compilerOptions": {"baseUrl&…

批量归一化(BN)和层归一化(LN)的区别

批量归一化(Batch Normalization, BN)和层归一化(Layer Normalization, LN)是深度学习中常用的两种归一化技术,它们主要用于解决训练过程中的内部协变量偏移问题,加速模型收敛和提高稳定性。 1. 为什么需要…

智能工厂生产设备实时监控技术的UI设计

智能工厂生产设备实时监控技术的UI设计

Java面试八股之死锁和饥饿的区别

死锁和饥饿的区别 定义与现象: 死锁(Deadlock)是指两个或多个线程互相等待对方持有的资源而无法继续执行的情况。每个线程至少持有一个资源,并尝试获取另一个由其他线程持有的资源,从而形成一个循环等待的僵局&#…

QAnything-1.4.01.4.1版本更新!使用指北!

久等了各位!时隔一个多月,我们在4月26日和5月20日接连发布了v1.4.0和v1.4.1两个版本,带来了问答性能,解析效果等多方面的改进,并新增了大量的新功能和新特性 详见:releases 以及 使用说明 最新特性表 开发…