Redis学习【7】之发布_订阅命令和事务
文章目录
- 一 发布/订阅命令
- 1.1 消息系统
- 1.2 subscribe
- 1.3 psubscribe
- 1.4 publish
- 1.5 unsubscribe
- 1.6 punsubscribe
- 1.7 pubsub
- 1.7.1 pubsub channels
- 1.7.2 pubsub numsub
- 1.7.3 pubsub numpat
- 二 Redis 事务
- 2.1 Redis 事务特性
- Redis 事务实现
- 2.1.1 三个命令
- 2.1.2 基本使用
- 2.2. Redis 事务异常处理
- 2.2.1 语法错误
- 2.2.2 执行异常
- 2.3 Redis 事务隔离机制
- 2.3.1 需要事务隔离机制的原因
- 2.3.2 隔离的实现
- 2.3.3 隔离的实现原理
一 发布/订阅命令
1.1 消息系统
- 发布/订阅(pub/sub),是一种消息通信模式:发布者【消息生产者】,生产和发送消息到存储系统;订阅者【消息消费者】,从存储系统接收和消费消息。这个存储系统可以是文件系统 FS、消息中间件 MQ、数据管理系统 DBMS,也可以是 Redis。 整个消息发布者、订阅者与存储系统称为消息系统。
- 消息系统中的订阅者订阅了某类消息后,只要存储系统中存在该类消息,其就可不断的接收并消费这些消息。当存储系统中没有该消息后,订阅者的接收、消费阻塞。而当发布者将消息写入到存储系统后,会立即唤醒订阅者。当存储系统放满时,不同的发布者具有不同的处理方式:有的会阻塞发布者的发布,等待可用的存储空间;有的则会将多余的消息丢失。
- 不同的消息系统消息的发布/订阅方式也是不同的。例如 RocketMQ、Kafka 等消息中间件构成的消息系统中,发布/订阅的消息都是以主题 Topic 分类的。而 Redis 构成的消息系统中,发布/订阅的消息都是以频道 Channel 分类的。

1.2 subscribe
- 格式:
SUBSCRIBE channel *channel …+ - 功能:Redis 客户端通过一个
subscribe命令可以同时订阅任意数量的频道。在输出了订阅主题后,命令处于阻塞状态,等待相关频道的消息。


1.3 psubscribe
- 格式:
PSUBSCRIBE pattern *pattern …+ - 功能:订阅一个或多个符合给定模式的频道
- 说明:这里的模式只能使用通配符
*。 如,it*可以匹配所有以 it 开头的频道,如it.news、it.blog、it.tweets;news.*可以匹配所有以news.开头的频道。


1.4 publish
- 格式:
PUBLISH channel message - 功能:Redis 客户端通过一条 publish 命令可以发布一个频道的消息,返回值为接收到该消息的订阅者数量。

1.5 unsubscribe
- 格式:
UNSUBSCRIBE *channel *channel …++ - 功能:Redis 客户端退订指定的频道
- 说明:如果没有频道被指定,会执行一个无参数的
unsubscribe命令,客户端使用SUBSCRIBE命令订阅的所有频道都会被退订。在这种情况下,返回一个信息,告知客户端所有被退订的频道

1.6 punsubscribe
- 格式:
PUNSUBSCRIBE *pattern *pattern …++ - 功能:退订一个或多个符合给定模式的频道
- 说明:这里的模式只能使用通配符
*。如果没有频道被指定,其效果与 SUBSCRIBE 命令相同,客户端将退订所有订阅的频道。

1.7 pubsub
- 格式:
PUBSUB <subcommand> [argument *argument …++ - 功能:
PUBSUB是一个查看订阅与发布系统状态的内省命令集,它由数个不同格式的子命令组成
1.7.1 pubsub channels
- 格式:
PUBSUB CHANNELS [pattern] - 功能:列出当前所有的活跃频道。活跃频道指的是那些至少有一个订阅者的频道。
- 说明:pattern 参数是可选的。如果不给出 pattern 参数,将会列出订阅/发布系统中的所有活跃频道。如果给出 pattern 参数,那么只列出和给定模式 pattern 相匹配的那些活跃频道。pattern 中只能使用通配符*。

1.7.2 pubsub numsub
- 格式:
PUBSUB NUMSUB [channel-1 … channel-N] - 功能:返回给定频道的订阅者数量。不给定任何频道则返回一个空列表。

1.7.3 pubsub numpat
- 格式:
PUBSUB NUMPAT - 功能:查询当前 Redis 所有客户端订阅的所有频道模式的数量总和

二 Redis 事务
- Redis 的事务的本质是一组命令的批处理。这组命令在执行过程中会被顺序地、一次性全部执行完毕,只要没有出现语法错误,这组命令在执行期间是不会被中断。
2.1 Redis 事务特性
- Redis 的事务仅保证数据的一致性,不具有像 DBMS 一样的 ACID 特性。
- 不具备原子性:这组命令中的某些命令的执行失败不会影响其它命令的执行,不会引发回滚。
- 没有复杂的隔离级别:这组命令通过乐观锁机制实现了简单的隔离性。
- 与事务无关:这组命令的执行结果是被写入到内存的,是否持久取决于 Redis 的持久化策略。
Redis 事务实现
2.1.1 三个命令
- Redis 事务通过三个命令进行控制。
- muti:开启事务
- exec:执行事务
- discard:取消事务
2.1.2 基本使用
- 下面是定义并执行事务的用法:事务执行后,再访问事务中定义的变量,其值是修改过后。

- 下面是定义但取消事务的举例:事务取消后,事务中的命令是没有执行的

2.2. Redis 事务异常处理
2.2.1 语法错误
- 当事务中的命令出现语法错误时,整个事务在 exec 执行时会被取消

2.2.2 执行异常
- 如果事务中的命令没有语法错误,但在执行过程中出现异常,该异常不会影响其它命令的执行。


2.3 Redis 事务隔离机制
2.3.1 需要事务隔离机制的原因
- 在并发场景下可能会出现多个客户端对同一个数据进行修改的情况,造成数据不一致的情况!
- 如:有两个客户端 C 左与 C 右,C 左需要申请 40 个资源,C 右需要申请 30 个资源。它们首先查看了当前拥有的资源数量,即 resources 的值为50,都感觉资源数量可以满足自己的需求,于是修改资源数量,以占有资源。但结果却是资源出现了“超卖”情况。

- 如:有两个客户端 C 左与 C 右,C 左需要申请 40 个资源,C 右需要申请 30 个资源。它们首先查看了当前拥有的资源数量,即 resources 的值为50,都感觉资源数量可以满足自己的需求,于是修改资源数量,以占有资源。但结果却是资源出现了“超卖”情况。
- Redis 事务通过乐观锁机制实现了多线程下的执行隔离
2.3.2 隔离的实现
- Redis 通过 watch 命令再配合事务实现了多线程下的执行隔离

- 以上两个客户端执行的时间顺序为:

2.3.3 隔离的实现原理
- 当某一客户端对 key 执行了 watch 后,系统就会为该 key 添加一个 version 乐观锁,并初始化 version。例如初值为 1.0。
- 此后客户端 C 左将对该 key 的修改语句写入到了事务命令队列中,虽未执行,但其将该key 的 value 值与 version 进行了读取并保存到了当前客户端缓存。此时读取并保存的是version 的初值 1.0。
- 此后客户端 C 右对该 key 的值进行了修改,这个修改不仅修改了 key 的 value 本身,同时也增加了 version 的值,例如使其 version 变为了 2.0,并将该 version 记录到了该 key信息中。
- 此后客户端 C 左执行 exec,开始执行事务中的命令。不过,其在执行到对该 key 进行修改的命令时,该命令首先对当前客户端缓存中保存的 version 值与当前 key 信息中的version 值。如果缓存 version 小于 key 的 version,则说明客户端缓存的 key 的 value 已经过时,该写操作如果执行可能会破坏数据的一致性。所以该写操作不执行

相关文章:
Redis学习【7】之发布_订阅命令和事务
文章目录一 发布/订阅命令1.1 消息系统1.2 subscribe1.3 psubscribe1.4 publish1.5 unsubscribe1.6 punsubscribe1.7 pubsub1.7.1 pubsub channels1.7.2 pubsub numsub1.7.3 pubsub numpat二 Redis 事务2.1 Redis 事务特性Redis 事务实现2.1.1 三个命令2.1.2 基本使用2.2. Redi…...
MySQL8.0 optimizer_switch变化
Optimizer_switch变量是支持对优化器行为的控制。是一组值标志,每个标志都有一个on或off的值,以指示是否启用或禁用相应的行为。 MySQL8.0里除了熟悉的hash join重大变化之外,其他方面也有优化。 mysql> SHOW VARIABLES LIKE OPTIMIZER_…...
Web--Maven
1.maven管理项目的区别 2. 安装后,conf目录下的setting文件中,对本地仓库的配置 此处可替换成自定义的本地仓库地址,默认为c:/user/17860/.m2/repository(我的电脑上的) 3.maven项目的标准目录结构 4.项目的生命周期 5.Maven概…...
深入理解MySQLⅢ -- 锁与InnoDB引擎
文章目录锁概述全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁&临键锁InnoDB引擎逻辑存储结构架构内存结构磁盘结构后台线程事务原理redo logundo logMVCC锁 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源&#x…...
Win11电脑速度慢、延迟高怎么办?
作为新版的系统,Windows 11还需要更多的时间完善。不少用户反映升级了Win11后反而感觉速度慢,还有延迟或死机现象。 如果你使用Win11系统时也有这种感觉,那这篇文章就是为你提供的。 问题可能出在系统存储容量低、驱动程序已过时࿰…...
【双指针问题】977. 有序数组的平方
Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…...
Meta AR眼镜主管:正开发史无前例的AR,但要解决很多困难
前不久,Meta CTO Andrew Bosworth在个人博客上“怒斥”公司内部不够专注,应该将资源投入在有核心竞争力、高投资回报率的业务上,而不是开发取悦用户却不赚钱的产品。尽管删除一些小众功能后,用户可能会不满,但为了让Me…...
Docker 搭建KingbaseES主备流复制
author: aming email: jikcheng163.com title: Docker 安装KingbaseES读写分离集群 creation_date: 2023-02-16 13:59 Last modified date: 2023-02-16 19:18 tags: Docker 安装KingbaseES读写分离集群 File Folder with relative path: reading notes/doc/Docker技术入门与实战…...
java易错题锦集四
effective java 不要再构造方法中启动任何线程 g new GameServer(); g.start();构造器无返回值,但是不能void修饰 字符串 String是包装类型吗?答案: 不是 对应的基本类型和包装类如下表: 基本数据类型 包装类 byte Byte bool…...
每天10个前端小知识 【Day 17】
前端面试基础知识题 1.使用原生js实现以下效果:点击容器内的图标,图标边框变成border:1px solid red,点击空白处重置 const box document.getElementById(box); function isIcon(target) { return target.className.includes(icon); } b…...
Python语言零基础入门教程(二十三)
16、Python os.fpathconf() 方法 概述 os.fpathconf() 方法用于返回一个打开的文件的系统配置信息。 Unix上可用。 语法 fpathconf()方法语法格式如下: os.fpathconf(fd, name)参数 fd – 打开的文件的描述符。 name – 可选,和buffersize参数和Pyt…...
[ansible系列]ansible使用扩展
目录 一. 本地执行 二. 任务委托 三. 任务暂停 四. 滚动执行 五. 只执行一次 六. 设置环境变量 七. 交互提示 一. 本地执行 我们知道ansible的是操作被控端的,所有执行的动作都是在被控端上完成的,当然在某些特定的时候我们想要有些tas…...
Java工具类(时间格式转换)
import java.util.Date; import java.text.DateFormat; /** * 格式化时间类 * DateFormat.FULL 0 * DateFormat.DEFAULT 2 * DateFormat.LONG 1 * DateFormat.MEDIUM 2 * DateFormat.SHORT 3 * author Michael * version 1.0, 2007/03/09 */ public c…...
数据库(第五次作业)
1.1 Redis概述 1.1.1 什么是Redis 2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便开始对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据…...
代码随想录【Day16】| 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和
110. 平衡二叉树 题目链接 题目描述: 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,nul…...
套娃式工具!用 AI 识别 AI ?#AI classifier
2022年以来,市面上就出现了不少 AI 生成文本的工具,尤其是 OpenAI 推出的 ChatGPT ,不仅能够协助完成撰写邮件、视频脚本、文案、翻译、代码等任务,还能通过学习和理解人类的语言来进行对话,并根据聊天的上下文进行互动…...
CURL error 60: SSL certificate problem: certificate has expired
项目使用guzzleHttp做的一个接口,报错:certificate has expired 因为在linux centos环境与window环境有所不同,在此记录一下解决过程。 目录 报错提示 原因 解决方式 1.去掉guzzlehttp的验证 2.更新CA证书 总结 报错提示 cURL error 60…...
接口自动化:requests
引言:目前软件测试对测试人员的能力要求 业务测试能力:占比5-6成接口、自动化、性能测试能力:占比4-5成流程规范:1成(需要综合型的测试人才):业务能力、代码能力、开发思维(封装&…...
极简TypeScript教程--数据类型
TypeScript最大的特点就是有类型检测,格式为let/const 标识符: 数据类型 赋值;例子:let msg: string Hello World这样msg这个变量就有了字符串类型,如果再给他赋值为数字类型,就会在编译期报错。变量的类型推导在开发中,有时候为了方便起见…...
JAVA开发测试(jmeter如何测试性能与估算)
对C的业务网站或应用,进行性能测试来评估使用服务器情况是必不可少的一项工作。 一、测试工具: Apache JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能,是Apache组织开发的…...
Mysql是怎么加锁的?
原文地址https://www.xiaolincoding.com/mysql/lock/how_to_lock.html#%E4%BB%80%E4%B9%88-sql-%E8%AF%AD%E5%8F%A5%E4%BC%9A%E5%8A%A0%E8%A1%8C%E7%BA%A7%E9%94%81 我只是精简一下做个记录 这篇汇总将基于 MySQL 8.0 的 InnoDB 引擎,在 可重复读(Repe…...
嵌入式Linux驱动开发核心技术解析
嵌入式Linux驱动工程师面试技术要点解析1. Linux驱动开发核心技术考察1.1 进程同步机制Linux内核提供了多种进程同步机制,包括:信号量(Semaphore):用于控制对共享资源的访问互斥锁(Mutex)&#…...
接近开关和光电开关接头:A编码M12一体式防水连接器规格解析
在工业自动化现场,接近开关与光电开关是应用最广泛的传感器。其标准接口——A编码M12一体式防水连接器(预铸线缆型),通过统一的机械尺寸与电气定义,实现了传感器的即插即用与高可靠连接。一、规格标准与接口定义A编码M…...
嵌入式开发中的静态代码分析工具与应用
嵌入式代码静态分析工具深度解析1. 静态代码分析技术概述1.1 传统编译器的局限性标准C语言编译器通常只能检测代码中的语法错误和部分潜在缺陷,对于程序架构设计和逻辑层面的问题往往无能为力。这种局限性在嵌入式开发中尤为明显,因为嵌入式系统对代码质…...
Win11Debloat:Windows系统轻量优化解决方案
Win11Debloat:Windows系统轻量优化解决方案 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以简化和改善你的Win…...
Python制作简易PDF查看工具——PDFViewerV1.0
PDFViewer PDF浏览工具,是使用Python语言(使用PyQt5开发界面,PDF解析使用PyMuPDF开源模块)开发的PDF查看工具,已经实现基本翻页浏览、OCR文字识别(基于开源主流文字识别模型实现)、内容查找高亮…...
3步搞定B站音频提取:BilibiliDown开源工具的终极指南
3步搞定B站音频提取:BilibiliDown开源工具的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi…...
Maxwell16.0实战:如何用实验电流数据搞定电机仿真(附.tab文件制作技巧)
Maxwell16.0实战:实验电流数据驱动电机仿真的全流程解析 电机仿真作为现代工业设计的重要环节,其准确性直接影响产品性能评估。而将实测电流数据融入仿真流程,往往是工程师突破"理想模型"局限的关键一步。本文将系统性地拆解从实验…...
3步搞定ViGEmBus:Windows虚拟游戏手柄驱动终极指南 [特殊字符]
3步搞定ViGEmBus:Windows虚拟游戏手柄驱动终极指南 🎮 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 想要在Windows上体验更丰富的游…...
强强联合!望石智慧携手华为、华鲲振宇发布AI药物研发联合解决方案,共筑中国智慧医药创新生态
近日,以“因聚而升 融智有为”为主题的华为中国合作伙伴大会2026在深圳圆满落幕。望石智慧作为其国内AI驱动医药创新领域的核心技术伙伴受邀参会,并在智能制造医药行业论坛发表演讲。会议期间,望石智慧、华为、华鲲振宇三方达成战略级生态合作…...
