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

Redis发布和订阅

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者(sub) 接收消息 可以实现进程间的消息传递。这种模式非常适用于实时消息传递、事件通知和消息分发等场景

Redis可以实现消息中间件MQ的功能,通过发布订阅实现消息的引导和分流。但是目前不推荐使用该功能,专业的事情交给专业的中间件处理,redis就做好分布式缓存功能

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

1.如何使用Redis发布订阅

  1. 订阅频道:客户端可以使用SUBSCRIBE命令订阅一个或多个频道。例如,SUBSCRIBE channel1 channel2订阅两个频道。

  2. 发布消息:使用PUBLISH命令,发布者可以向指定频道发送消息,如PUBLISH channel1 "Hello World"

  3. 接收消息:订阅了频道的客户端将接收到发布到这些频道的所有消息。

  4. 取消订阅:客户端可以使用UNSUBSCRIBE命令来退订一个或多个频道

发布订阅的特点

  • 解耦:发布者和订阅者之间是解耦的,发布者发送消息时不需要知道哪些订阅者会接收到这些消息。

  • 动态:订阅者可以随时订阅或退订频道,而不需要重新启动服务或进行复杂的配置。

  • 简单:Redis的发布订阅模型易于理解和实现,适合快速开发和部署。

2.发布和订阅流程图

客户端可以订阅频道如下图

当给这个频道发布消息后,消息就会发送给订阅的客户端

发布/订阅其实是一个轻量化的队列,只不过数据不会持久化,一般用来处理实时性较高的异步消息。

推荐先执行订阅然后再发布,订阅成功之前发布的消息是收不到的

3.操作命令

# 1. SUBSCRIBE channel [channel ...] 订阅给定的一个或多个频道的信息
# 订阅的客户端每次可以收到一个3个参数的消息
# 消息种类
# 始发频道的名称
# 实际的消息内容
127.0.0.1:6379> subscribe channel# PUBLISH channel message   发布消息到指定的频道
127.0.0.1:6379> publish channel hello# PSUBSCRIBE pattern [pattern ...]按照模式批量订阅,订阅一个或多个符合给定模式(支持*号?号之类的)的频道
127.0.0.1:6379> PSUBSCRIBE a* b?# PUBSUB subcommand [argument [argument ...]]  查看订阅与发布系统
# PUBSUB CHANNELS  由活跃频道组成的列表
# PUBSUB NUMSUB [channel [channel ...]]  某个频道有几个订阅者
# PUBSUB NUMPAT  只统计使用PSUBSCRIBE命令执行的返回客户端订阅的唯一模式的数量# UNSUBSCRIBE [channel [channel ...]] 退订给定的频道# PUNSUBSCRIBE [pattern [pattern ...]] 退订所有给定模式的频道

注:发布的消息没有持久化,如果在订阅的客户端收不到 hello,只能收到订阅后发布的消息

4.总结

可以实现消息中间件MQ的功能,通过发布订阅实现消息的引导和分流。但是不推荐使用该功能,专业的事情交给专业的中间件处理,redis就做好分布式缓存功能

PUB/SUB缺点

  1. 发布的消息在Redis系统中不能持久化,因此,必须先执行订阅,在等待消息发布。如果先发布了消息,那么该消息由于没有订阅者,消息将被直接丢弃

  2. 消息只管发送,对于发布者而言消息是即发即失,不管接受,也没有ACK机制,无法保证消息的消费成功

  3. 以上的缺点导致Redis的Pub/Sub模式就像个小玩具,在生产环境中几乎无用武之地,为此Redis5.0版本新增了Stream数据结构,不但支持多播,还支持数据持久化,相比Pub/Sub更加的强大

基于以上的缺点,在实际操作中需要考虑以下因素:

  • 消息的持久化:Redis Pub/Sub本身不提供持久化,如果需要保证消息不丢失,可能需要额外的机制或使用其他数据结构如Streams。

  • 消息的确认机制:Redis Pub/Sub不提供消息确认,如果需要确认消息已被订阅者成功处理,需要在应用层实现。

  • 安全性:确保只有授权的订阅者可以接收敏感消息。

  • 错误处理:实现错误处理机制,以便在消息传递过程中出现问题时能够恢复。

  • 监控和日志:记录消息传递的日志,并使用监控工具来跟踪系统性能和健康状态。

感谢大家,请大家多多支持!

相关文章:

Redis发布和订阅

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者(sub) 接收消息 可以实现进程间的消息传递。这种模式非常适用于实时消息传递、事件通知和消息分发等场景 Redis可以实现消息中间件MQ的功能,通过发布订阅实现消息…...

计算机毕设设计推荐-基于python+Djanog大数据的电影数据可视化分析

精彩专栏推荐订阅:在下方主页👇🏻👇🏻👇🏻👇🏻 💖🔥作者主页:计算机毕设木哥🔥 💖 文章目录 一、电影数据可视…...

dhtmlxGantt 甘特图 一行展示多条任务类型

效果如图: 后台拿到数据 处理之后如图: 含义: 如上图所示, 如果一行需要展示多个 需要给父数据的那条添加render:split属性, 子数据的parent为父数据的Id即可 切记 父数据的id 别为0 为0 时 会出现错乱 因为有些小伙伴提出分段展示的数据结构还是有点问题,下面展示一个完整…...

COLORmap

在这段MATLAB代码中,surf(peaks)、map的定义以及colormap(map)的调用共同完成了以下任务: 1. **绘制曲面图**: - surf(peaks):这个函数调用了MATLAB内置的peaks函数来生成数据,并使用surf函数将这些数据绘制成一个…...

手机在网状态查询接口如何用Java进行调用?

一、什么是手机在网状态查询接口? 手机在网状态查询接口,又叫运营商在网状态查询,手机号在网状态查询,传入手机号码,查询该手机号的在网状态,返回内容有正常使用、停机、在网但不可用、不在网(…...

mysql性能优化- 数据库配置优化

MySQL 性能优化 - 数据库配置优化 MySQL 是一个广泛使用的关系型数据库管理系统,但随着数据量的增长和访问频率的提高,其性能可能会成为瓶颈。为了保持高效的性能,除了应用层的查询优化和索引优化之外,数据库配置优化 也是非常重…...

(算法)大数的进制转换

题目描述 将一个长度最多为30位数字的十进制非负整数转换为二进制数输出输入描述: 多组数据,每行为一个长度不超过30位的十进制非负整数。 (注意是10进制数字的个数可能有30个,而非30bits的整数)解析 例子 :123&…...

演示jvm锁存在的问题

文章目录 1、AlbumInfoApiController --》testLock()2、redis添加键值对3、AlbumInfoServiceImpl --》testLock() 没有加锁4、使用ab工具测试4.1、安装 ab 工具4.2、查看 redis 中的值 5、添加本地锁 synchronized6、集群情况下问题演示 jvm锁:synchronized lock 只…...

Android SharedPreference详解

Android SharedPreference详解 SharedPreferences作为一种数据持久化的方式,是处理简单的key-value类型数据时的首选。 一般用法: //demo是该sharedpreference对应文件名,对应的是一个xml文件,里面存放key-value格式的数据. SharedPreferences sharedPreferences…...

论文阅读 | 可证安全隐写(网络空间安全科学学报 2023)

可证安全隐写:理论、应用与展望 一、什么是可证安全隐写? 对于经验安全的隐写算法,即使其算法设计得相当周密,隐写分析者(攻击者)在观察了足够数量的载密(含有隐写信息的数据)和载体…...

Arthas jvm(查看当前JVM的信息)

文章目录 二、命令列表2.1 jvm相关命令2.1.3 jvm(查看当前JVM的信息) 二、命令列表 2.1 jvm相关命令 2.1.3 jvm(查看当前JVM的信息) 基础语法: jvm [arthas18139]$ jvmRUNTIME …...

【c++】介绍

C是一种强大而灵活的编程语言,广泛用于开发各种应用程序和系统软件。它结合了C语言的高效性和面向对象编程的特性,为程序员提供了丰富的工具和功能,以满足各种编程需求。 C的历史可以追溯到上世纪80年代,最初由丹尼斯里奇和贝尔实…...

JavaScript typeof与instanceof的区别

typeof 和 instanceof 都是 JavaScript 中的运算符,用于检查数据类型或对象的类型。它们有不同的用途和适用场景: 1. typeof 作用:返回变量的数据类型,适用于原始数据类型(如 number、string、boolean 等&#xff09…...

C++11 可变的模板参数

前言 本期我们接着继续介绍C11的新特性,本期我们介绍的这个新特性是很多人都感觉抽象的语法!它就是可变的模板参数! 目录 前言 一、可变的模板参数 1.1可变的参数列表 1.2可变的参数包 1.3可变参数包的解析 • 递归展开解析 • 逗号…...

手机在网状态查询接口如何用PHP进行调用?

一、什么是手机在网状态查询接口? 手机在网状态查询接口,即输入手机号码查询手机号在网状态,返回有正常使用、停机、在网但不可用、不在网(销号/未启用/异常)、预销户等多种状态。 二、手机在网状态查询适用哪些场景…...

MATLAB中多张fig图合并为一个图

将下列两个图和为一个图 打开查看-----绘图浏览器 点击第一幅图中曲线右键复制,到第二幅图中粘贴即可完成...

Java启动Tomcat: Can‘t load IA 32-bit .dll on a AMD 64-bit platform报错问题解决

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

基于微信小程序的家教信息管理系统的设计与实现(论文+源码)_kaic

摘 要 随着互联网时代的来临,使得传统的家教模式已不复存在,亟需一种方便、快捷的在线教学平台。因此,利用Java语言作为支撑和MySQL数据库存储数据,结合微信小程序的便利性,为用户开发出了一个更加人性化、方便的家庭…...

【Android】BottomSheet基本用法总结(BottomSheetDialog,BottomSheetDialogFragment)

BottomSheet BottomSheet 是一种位于屏幕底部的面板,用于显示附加内容或选项。提供了从屏幕底部向上滑动显示内容的交互方式。这种设计模式在 Material Design 中被广泛推荐,因为它可以提供一种优雅且不干扰主屏幕内容的方式来展示额外信息或操作。 具体…...

Linux下实现ls命令的功能

教材:<Linux编程技术详解> 杜华 编著 人民邮电出版社 参考页码:P136 书中源代码: //p4.10.c 实现类似ls命令的功能 #include<stdio.h> #include<sys/types.h> #include<dirent.h> #include<stdlib.h> #include<sys/stat.h> #include&l…...

FMCW激光雷达深度剖析:从硅光芯片到车载落地的技术跃迁

1. FMCW激光雷达的技术本质&#xff1a;从硅光芯片到系统集成 第一次拆解FMCW激光雷达时&#xff0c;我被它的内部结构震撼到了——这哪里是传统意义上的激光雷达&#xff1f;分明是一个高度集成的光通信模块。与传统TOF激光雷达相比&#xff0c;FMCW最核心的突破在于它把测距原…...

VSCode 中使用 MATLAB 安装流程

文章目录 运行程序 修改 Code-Runner 文件 使用 Copilot 如何开启 MATLAB 调试功能 Matlab: Linter Config(代码检查器配置):保持空白就好。 Linter(在这里指的是 MATLAB 的 mlint)是一个静态代码分析工具。它会在你写代码时,自动用波浪线提示语法错误或者给出优化建议(…...

React Native Interactable跨平台开发终极指南:iOS与Android差异处理技巧

React Native Interactable跨平台开发终极指南&#xff1a;iOS与Android差异处理技巧 【免费下载链接】react-native-interactable Experimental implementation of high performance interactable views in React Native 项目地址: https://gitcode.com/gh_mirrors/re/react…...

ShareList插件开发全攻略:从零开始打造专属网盘工具

ShareList插件开发全攻略&#xff1a;从零开始打造专属网盘工具 【免费下载链接】sharelist 快速分享 GoogleDrive OneDrive 项目地址: https://gitcode.com/gh_mirrors/sh/sharelist ShareList是一款强大的开源网盘工具&#xff0c;支持快速挂载Google Drive、OneDriv…...

避开Arduino PID编程的3个常见坑:为什么你的控制总是不稳?

Arduino PID控制实战&#xff1a;避开3个致命陷阱实现精准调节 当你在深夜盯着反复震荡的电机转速曲线&#xff0c;或是加热棒温度始终无法稳定的数据时&#xff0c;是否怀疑过自己复制的PID代码有问题&#xff1f;这不是你的错觉——大多数Arduino PID控制问题都源于三个容易被…...

棕榈酰化修饰:从基础研究到癌症治疗的5个关键突破点

棕榈酰化修饰&#xff1a;从基础研究到癌症治疗的5个关键突破点 在肿瘤免疫治疗领域&#xff0c;蛋白质翻译后修饰的调控机制正成为突破性疗法的新靶点。棕榈酰化修饰——这种将16碳棕榈酸共价连接到蛋白质半胱氨酸残基上的动态过程&#xff0c;近年来因其在癌细胞信号传导中的…...

OpenClaw安全实践:千问3.5-27B私有化部署下的权限管控

OpenClaw安全实践&#xff1a;千问3.5-27B私有化部署下的权限管控 1. 为什么需要关注OpenClaw的安全配置&#xff1f; 去年我在尝试用OpenClaw自动整理财务报表时&#xff0c;差点酿成一场灾难。当时我的脚本误将未加密的财务数据同步到了公开目录&#xff0c;幸亏及时发现。…...

Spring with AI (3): 定制对话——Prompt模板引入

1 创建模板先在pom.xml引入验证Starter&#xff1a;<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>我们定义一个关于“世界各国地理历史知识”的AI&…...

Python数据类配置模式详解

在现代Python应用开发中&#xff0c;配置管理是一个关键环节。今天我们来深入分析一个优雅的配置管理实现&#xff0c;它展示了如何将环境变量配置与数据类完美结合。 核心概念 让我们先看一个典型的配置类实现&#xff1a; from __future__ import annotations import os from…...

突破企业AI应用开发瓶颈:Awesome-Dify-Workflow无代码解决方案深度剖析

突破企业AI应用开发瓶颈&#xff1a;Awesome-Dify-Workflow无代码解决方案深度剖析 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程&#xff0c;自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/…...