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

Redis 之三:Redis 的发布订阅(pub/sub)

概念介绍

Redis 发布订阅 (pub/sub) 是一种消息通信模式,它允许客户端之间进行异步的消息传递

Redis 客户端可以订阅任意数量的频道。

模型中的角色

在该模型中,有三种角色:

  1. 发布者(Publisher):负责发送信息的客户端,使用 PUBLISH 命令将消息发送到指定的频道(channel)。

    PUBLISH channel message

    发布者不关心是否有订阅者正在监听该频道。

  2. 订阅者(Subscriber):通过调用 SUBSCRIBE 或 PSUBSCRIBE 命令来监听一个或多个频道的消息。

    SUBSCRIBE channel1 channel2 ... channelN
    PSUBSCRIBE pattern1 pattern2 ...
    • SUBSCRIBE 用于订阅特定频道名称。
    • PSUBSCRIBE 则用于订阅满足给定模式的频道,例如通配符模式。
  3. 频道(Channels):消息传递的通道,每个频道都有自己的名称,所有向这个频道发布的信息都会被订阅了该频道的所有订阅者接收到。

特性

  • 发布订阅是异步的单向通信机制,发布者与订阅者之间没有直接的连接。
  • 订阅者只能接收订阅之后发布的消息,不能获取历史消息。
  • Redis Pub/Sub 是一个简单的消息队列解决方案,但不适合需要持久化消息或者保证消息可靠传递的场景,因为如果订阅者在消息发布期间断开连接,则会丢失该消息。

因此,Redis 的发布订阅功能适用于实时消息通知、事件驱动编程以及轻量级的消息队列应用场景。

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

具体操作

1)订阅频道

开启多个客户端: redis-cli

订阅一个频道(创建和开启频道)

127.0.0.1:6379> subscribe WDZL
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "WDZL"
3) (integer) 1
##### 订阅和开启了一个频道 WDZL

再开启一个客户端,执行上面相同的操作,订阅同一个频道

共计开启2个以上客户端。

2)查询频道

然后再在第三个客户端去查询活跃的频道

PUBSUB CHANNELS       # pubsub channels 为关键字
PUBSUB CHANNELS ch*   # 名字匹配  
PUBSUB NUMSUB ch2     # 打印订阅ch2频道的客户端订阅的所有模式的数量总和

查询活跃的频道

127.0.0.1:6379> pubsub channels
1) "BWL"
2) "WDZL"

查询指定频道的订阅数量

127.0.0.1:6379> pubsub numsub BWL
1) "BWL"
2) (integer) 2
3)发布消息

发布订阅消息: publish

127.0.0.1:6379> publish BWL Hello,Welcome!
(integer) 2
#### 显示发布成功接收的数量

再到订阅者客户端查看是否收到消息

127.0.0.1:6379> subscribe BWL    
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "BWL"
3) (integer) 1     # 客户端一旦订阅后,就会进入阻塞状态,等待消息。不能做其他操作了
1) "message"
2) "BWL"
3) "Hello,Welcome!"

相关文章:

Redis 之三:Redis 的发布订阅(pub/sub)

概念介绍 Redis 发布订阅 (pub/sub) 是一种消息通信模式,它允许客户端之间进行异步的消息传递 Redis 客户端可以订阅任意数量的频道。 模型中的角色 在该模型中,有三种角色: 发布者(Publisher):负责发送信…...

ngx_waf入门教程:保护你的Nginx服务器

ngx_waf入门教程:保护你的Nginx服务器 在今天的网络环境中,安全性是每个网站和应用程序都必须考虑的关键因素。Nginx作为一款流行的开源Web服务器和反向代理服务器,广泛应用于各种业务场景。为了增强Nginx的安全性,我们可以使用n…...

视觉Transformers中的位置嵌入 - 研究与应用指南

视觉 Transformer 中位置嵌入背后的数学和代码简介。 自从 2017 年推出《Attention is All You Need》以来,Transformer 已成为自然语言处理 (NLP) 领域最先进的技术。 2021 年,An Image is Worth 16x16 Words 成功地将 Transformer 应用于计算机视觉任务…...

真香定律!我用这种模式重构了第三方登录

分享是最有效的学习方式。 博客:https://blog.ktdaddy.com/ 老猫的设计模式专栏已经偷偷发车了。不甘愿做crud boy?看了好几遍的设计模式还记不住?那就不要刻意记了,跟上老猫的步伐,在一个个有趣的职场故事中领悟设计模…...

Linux入门到入土

Linxu Linux 简介 Linux 内核最初只是由芬兰人林纳斯托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。 Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX(可移植操作系统接口&#xff09…...

基础真空技术外国文献Fundamentals of Vacuum Technology

基础真空技术外国文献Fundamentals of Vacuum Technology...

LeetCode每日一题【c++版】- 用队列实现栈与用栈实现队列

用队列实现栈 题目描述 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。int pop() 移除…...

深入理解快速排序算法:从原理到实现

目录 1. 引言 2. 快速排序算法原理 3. 快速排序的时间复杂度分析 4. 快速排序的应用场景 5. 快速排序的优缺点分析 5.1 优点: 5.2 缺点: 6. Java、JavaScript 和 Python 实现快速排序算法 6.1 Java 实现: 6.2 JavaScript 实现&#…...

设计模式----装饰器模式

在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰器模式来实现。 装饰器模式 允许向一个现有的对象添加新的功能,同时又不改变他的…...

Golang pprof 分析程序的使用内存和执行时间

一、分析程序执行的内存情况 package mainimport ("os""runtime/pprof" )func main() {// ... 你的程序逻辑 ...// 将 HeapProfile 写入文件f, err : os.Create("heap.prof")if err ! nil {panic(err)}defer f.Close()pprof.WriteHeapProfile(f…...

C/C++平方和问题(蓝桥杯)

题目描述: 小明对数位中含有2、0、1、9 的数字很感兴趣,在1 到40 中这样的数包 括1、2、9、10 至32、39 和40,共28 个,他们的和是574,平方和是14362。 注意,平方和是指将每个数分别平方后求和。 请问&#…...

(libusb) usb口自动刷新

文章目录 libusb自动刷新程序Code目录结构Code项目文件usb包code包 效果描述重置reset热拔插使用 END libusb 在操作USB相关内容时,有一个比较著名的库就是libusb。 官方网址:libusb 下载: 下载源码官方编好的库github:Release…...

NLP(一)——概述

参考书: 《speech and language processing》《统计自然语言处理》 宗成庆 语言是思维的载体,自然语言处理相比其他信号较为特别 word2vec用到c语言 Question 预训练语言模型和其他模型的区别? 预训练模型是指在大规模数据上进行预训练的模型,通常…...

智慧公厕:打造智慧城市的环卫明珠

在城市建设中,公共卫生设施的完善和智能化一直是重要环节。而智慧公厕作为智慧城市建设的重要组成部分,发挥着不可替代的作用。本文以智慧公厕源头实力厂家广州中期科技有限公司,大量精品案例现场实景实图,解读智慧公厕如何助力打…...

[LeetBook]【学习日记】寻找链表相交节点

来源于「Krahets」的《图解算法数据结构》 https://leetcode.cn/leetbook/detail/illustration-of-algorithm/ 本题与主站 160 题相同:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/ 训练计划 V 某教练同时带教两位学员,分别以…...

【Python】OpenCV-使用ResNet50进行图像分类

使用ResNet50进行图像分类 如何使用ResNet50模型对图像进行分类。 import os import cv2 import numpy as np from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input, decode_predictions from tensorflow.keras.preprocessing import image# 设置…...

TypeError: `dumps_kwargs` keyword arguments are no longer supported

TypeError: dumps_kwargs keyword arguments are no longer supported 1. 问题描述2. 解决方法 1. 问题描述 使用 FastChat 启动私有大语言模型,通过一些 UI 工具进行访问时,报以下错误。 略 2024-02-29 09:26:14 | ERROR | stderr | yield f"…...

设计模式学习笔记 - 设计原则 - 3.里氏替换原则,它和多态的区别是什么?

前言 今天来学习 SOLID 中的 L:里氏替换原则。它的英文翻译是 Liskov Substitution Principle,缩写为 LSP。 英文原话是: Functions that use points of references of base classes must be able to use objects of derived classes withou…...

java实现图片转pdf,并通过流的方式进行下载(前后端分离)

首先需要导入相关依赖,由于具体依赖本人也不是记得很清楚了,所以简短的说一下。 iText:PDF 操作库,用于创建和操作 PDF 文件。可通过 Maven 或 Gradle 引入 iText 依赖。 MultipartFile:Spring 框架中处理文件上传的类…...

如何系统的学习Python——Python的基本语法

学习Python的基本语法是入门的第一步,以下是一些常见的基本语法概念: 注释: 用#符号来添加单行注释,或使用三引号(或""")来添加多行注释。 # 这是一个单行注释 这是 多行 注释 变量和数据类型: 变量用…...

3分钟彻底清理Windows右键菜单:ContextMenuManager让你的操作效率翻倍

3分钟彻底清理Windows右键菜单:ContextMenuManager让你的操作效率翻倍 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 还在为Windows右键菜单越来越臃…...

混合基FFT,matlab实现

参考数字信号处理教程第四版(程佩青著)第四章FFT这里直接给出matlab函数,性能不保证最优注意,此函数只能处理混合基fft,即输入信号x的长度不能是素数,不能是2次幂整数function X mixedRadixFFT(x)% multiB…...

Topit 技术深度:macOS窗口层级管理的现代SwiftUI实现与架构解析

Topit 技术深度:macOS窗口层级管理的现代SwiftUI实现与架构解析 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 深夜两点,当大多数开发者…...

2026年第十八届“中国电机工程学会杯”全国大学生电工数学建模竞赛A题绿电直连型电氢氨园区优化运行参考仿真及论文(仿真代码+论文)

2026年第十八届“中国电机工程学会杯”全国大学生电工数学建模竞赛A题绿电直连型电氢氨园区优化运行参考仿真及论文。www.bilibili.com/video/BV1Q7Li6hE27/?vd_source6ea1beb17174384a0b3d09d6d35580f6 摘 要 本文针对绿电直连型电氢氨园区的优化运行问题,在题目…...

嵌入式开发新趋势:从硬件参数到场景方案,AI与可靠性成关键

1. 展会现场与行业风向初探上周,我作为飞凌嵌入式的一名老员工,亲身参与了2024上海国际嵌入式展。这不仅仅是一次简单的产品展示,更像是一场行业同仁的“华山论剑”。从人头攒动的展台到技术论坛上激烈的讨论,你能清晰地感受到&am…...

装上这个技能,让你的 OpenClaw 和 Hermes 变身私人旅行规划师

一句话说清楚给小龙虾和马装上 Voyago,以后你只需要说"帮我规划杭州两天一夜",它就会自动帮你查火车票、搜机票、找酒店、查门票、规划路线、搜小红书攻略、算预算,最终输出一份万字级的完整旅行方案——精确到每两个地点之间坐几号…...

Unity连接Arduino BLE实战:5分钟实现PC端双向通信

1. 这不是“配对”,而是让Unity像手机App一样和Arduino对话很多人第一次尝试Unity连接Arduino蓝牙模块时,会下意识打开Windows的“蓝牙设置”去“添加设备”——结果折腾半小时,Unity里依然收不到任何数据。我最初也这么干过,直到…...

神经符号系统实践手记:可微逻辑层与梯度重定向实现

1. 这不是又一个“AI综述”,而是一份可拆解、可复现的神经符号系统实践手记“Neurosymbolic AI”这个词,过去三年在顶会论文标题里出现频率翻了四倍,但真正能说清“我在哪一步调用了符号规则”“我的反向传播怎么和逻辑推理共存”的人&#x…...

AI如何重塑移动App开发:从功能交付到智能服务的范式跃迁

1. 项目概述:当手机App开发不再只是“写代码”,而变成一场数据驱动的智能进化“How AI and ML are Turning the Mobile App Development Industry into a Smart Industry?”——这个标题不是一句空泛的行业口号,而是我过去三年深度参与17个中…...

给电力行业装上“地理大脑”:百度智能云图云做了一次“地址大模型”变革

“我家在老三中对面那条巷子,供电局以前的老院子旁边……”当95598客服接到这样的报修电话时,系统该如何精准定位?这并非个例。城市快速扩张、街巷小区不断新建更名,而电力系统的地址数据往往跟不上现实变化。同时,传统…...