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

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.tweetsnews.*可以匹配所有以 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,都感觉资源数量可以满足自己的需求,于是修改资源数量,以占有资源。但结果却是资源出现了“超卖”情况。
      在这里插入图片描述
  • Redis 事务通过乐观锁机制实现了多线程下的执行隔离

2.3.2 隔离的实现

  • Redis 通过 watch 命令再配合事务实现了多线程下的执行隔离
    在这里插入图片描述
  • 以上两个客户端执行的时间顺序为:
    在这里插入图片描述

2.3.3 隔离的实现原理

  1. 当某一客户端对 key 执行了 watch 后,系统就会为该 key 添加一个 version 乐观锁,并初始化 version。例如初值为 1.0。
  2. 此后客户端 C 左将对该 key 的修改语句写入到了事务命令队列中,虽未执行,但其将该key 的 value 值与 version 进行了读取并保存到了当前客户端缓存。此时读取并保存的是version 的初值 1.0。
  3. 此后客户端 C 右对该 key 的值进行了修改,这个修改不仅修改了 key 的 value 本身,同时也增加了 version 的值,例如使其 version 变为了 2.0,并将该 version 记录到了该 key信息中。
  4. 此后客户端 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变量是支持对优化器行为的控制。是一组值标志&#xff0c;每个标志都有一个on或off的值&#xff0c;以指示是否启用或禁用相应的行为。 MySQL8.0里除了熟悉的hash join重大变化之外&#xff0c;其他方面也有优化。 mysql> SHOW VARIABLES LIKE OPTIMIZER_…...

Web--Maven

1.maven管理项目的区别 2. 安装后&#xff0c;conf目录下的setting文件中&#xff0c;对本地仓库的配置 此处可替换成自定义的本地仓库地址&#xff0c;默认为c:/user/17860/.m2/repository(我的电脑上的&#xff09; 3.maven项目的标准目录结构 4.项目的生命周期 5.Maven概…...

深入理解MySQLⅢ -- 锁与InnoDB引擎

文章目录锁概述全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁&临键锁InnoDB引擎逻辑存储结构架构内存结构磁盘结构后台线程事务原理redo logundo logMVCC锁 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#x…...

Win11电脑速度慢、延迟高怎么办?

作为新版的系统&#xff0c;Windows 11还需要更多的时间完善。不少用户反映升级了Win11后反而感觉速度慢&#xff0c;还有延迟或死机现象。 如果你使用Win11系统时也有这种感觉&#xff0c;那这篇文章就是为你提供的。 问题可能出在系统存储容量低、驱动程序已过时&#xff0…...

【双指针问题】977. 有序数组的平方

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…...

Meta AR眼镜主管:正开发史无前例的AR,但要解决很多困难

前不久&#xff0c;Meta CTO Andrew Bosworth在个人博客上“怒斥”公司内部不够专注&#xff0c;应该将资源投入在有核心竞争力、高投资回报率的业务上&#xff0c;而不是开发取悦用户却不赚钱的产品。尽管删除一些小众功能后&#xff0c;用户可能会不满&#xff0c;但为了让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();构造器无返回值&#xff0c;但是不能void修饰 字符串 String是包装类型吗&#xff1f;答案&#xff1a; 不是 对应的基本类型和包装类如下表&#xff1a; 基本数据类型 包装类 byte Byte bool…...

每天10个前端小知识 【Day 17】

前端面试基础知识题 1.使用原生js实现以下效果&#xff1a;点击容器内的图标&#xff0c;图标边框变成border:1px solid red&#xff0c;点击空白处重置 const box document.getElementById(box); function isIcon(target) { return target.className.includes(icon); } b…...

Python语言零基础入门教程(二十三)

16、Python os.fpathconf() 方法 概述 os.fpathconf() 方法用于返回一个打开的文件的系统配置信息。 Unix上可用。 语法 fpathconf()方法语法格式如下&#xff1a; os.fpathconf(fd, name)参数 fd – 打开的文件的描述符。 name – 可选&#xff0c;和buffersize参数和Pyt…...

[ansible系列]ansible使用扩展

目录 一. 本地执行 二. 任务委托 三. 任务暂停 四. 滚动执行 五. 只执行一次 六. 设置环境变量 七. 交互提示 一. 本地执行 我们知道ansible的是操作被控端的&#xff0c;所有执行的动作都是在被控端上完成的&#xff0c;当然在某些特定的时候我们想要有些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&#xff0c; 2007/03/09 */ public c…...

数据库(第五次作业)

1.1 Redis概述 1.1.1 什么是Redis 2008年&#xff0c;意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG&#xff0c;然而没过多久该公司的创始人 Salvatore Sanfilippo便开始对MySQL的性能感到失望&#xff0c;于是他决定亲自为LLOOGG量身定做一个数据…...

代码随想录【Day16】| 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和

110. 平衡二叉树 题目链接 题目描述&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a;一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,nul…...

套娃式工具!用 AI 识别 AI ?#AI classifier

2022年以来&#xff0c;市面上就出现了不少 AI 生成文本的工具&#xff0c;尤其是 OpenAI 推出的 ChatGPT &#xff0c;不仅能够协助完成撰写邮件、视频脚本、文案、翻译、代码等任务&#xff0c;还能通过学习和理解人类的语言来进行对话&#xff0c;并根据聊天的上下文进行互动…...

CURL error 60: SSL certificate problem: certificate has expired

项目使用guzzleHttp做的一个接口&#xff0c;报错&#xff1a;certificate has expired 因为在linux centos环境与window环境有所不同&#xff0c;在此记录一下解决过程。 目录 报错提示 原因 解决方式 1.去掉guzzlehttp的验证 2.更新CA证书 总结 报错提示 cURL error 60…...

接口自动化:requests

引言&#xff1a;目前软件测试对测试人员的能力要求 业务测试能力&#xff1a;占比5-6成接口、自动化、性能测试能力&#xff1a;占比4-5成流程规范&#xff1a;1成&#xff08;需要综合型的测试人才&#xff09;&#xff1a;业务能力、代码能力、开发思维&#xff08;封装&…...

极简TypeScript教程--数据类型

TypeScript最大的特点就是有类型检测&#xff0c;格式为let/const 标识符: 数据类型 赋值;例子:let msg: string Hello World这样msg这个变量就有了字符串类型,如果再给他赋值为数字类型&#xff0c;就会在编译期报错。变量的类型推导在开发中&#xff0c;有时候为了方便起见…...

JAVA开发测试(jmeter如何测试性能与估算)

对C的业务网站或应用&#xff0c;进行性能测试来评估使用服务器情况是必不可少的一项工作。 一、测试工具&#xff1a; Apache JMeter 可以用于对服务器、网络或对象模拟巨大的负载&#xff0c;来自不同压力类别下测试它们的强度和分析整体性能&#xff0c;是Apache组织开发的…...

TongWeb实战:GBase数据库连接池的配置与性能调优指南

1. 连接池基础与TongWeb集成 第一次在TongWeb里配置GBase数据库连接池时&#xff0c;我犯了个低级错误——直接把最大连接数设成了1000&#xff0c;结果系统刚上线就崩溃了。后来才明白&#xff0c;连接池不是越大越好&#xff0c;它本质上是个数据库连接的共享停车场。想象一…...

端到端AI安家助手:基于WhatsApp的多模态智能体系统架构与实践

1. 项目概述&#xff1a;一个为加拿大新移民设计的端到端AI安家助手如果你刚到一个陌生的国家&#xff0c;面对一堆看不懂的表格、复杂的申请流程和紧迫的截止日期&#xff0c;是不是会感到手足无措&#xff1f;这正是许多加拿大新移民面临的真实困境。49th项目就诞生于这种切身…...

国标通气帽、DN200通气帽与市政管道通气帽怎么选?

我第一次接触通气帽这玩意儿&#xff0c;是在一个闷热的下午。工地上尘土飞扬&#xff0c;师傅递给我一个金属罩子&#xff0c;说&#xff1a;“这是通气用的&#xff0c;别小看它。”我当时还纳闷&#xff1a;不就是个帽子嘛&#xff0c;能有多大讲究&#xff1f;后来才明白&a…...

终极指南:3分钟学会在Windows电脑上安装安卓应用

终极指南&#xff1a;3分钟学会在Windows电脑上安装安卓应用 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想过在Windows电脑上直接运行手机应用&#xff…...

跨平台文件自由:Free-NTFS-for-Mac 终极解决方案深度解析

跨平台文件自由&#xff1a;Free-NTFS-for-Mac 终极解决方案深度解析 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and management…...

Typora“激活”与“美化”实战指南

1. Typora基础认知与安装准备 Typora作为一款广受好评的Markdown编辑器&#xff0c;其独特之处在于将编辑与预览合二为一。不同于传统Markdown编辑器需要分屏显示源代码和渲染效果&#xff0c;Typora实现了真正的所见即所得——你在编辑区输入的Markdown语法会实时转换为排版效…...

别再只会用IP核了!手把手教你用Verilog从零实现一个16阶FIR滤波器(附完整代码)

从零构建16阶FIR滤波器&#xff1a;Verilog实战指南与工程思维解析 在FPGA开发领域&#xff0c;FIR&#xff08;有限脉冲响应&#xff09;滤波器是数字信号处理的基础模块&#xff0c;但大多数工程师习惯直接调用厂商提供的IP核&#xff0c;这就像只会开自动挡汽车的司机——虽…...

Linux服务器运维实战:为什么我更推荐用apt安装FileZilla而不是下载tar包?

Linux服务器运维实战&#xff1a;为什么我更推荐用apt安装FileZilla而不是下载tar包&#xff1f; 每次在Linux服务器上部署FTP客户端时&#xff0c;我都会面临一个选择&#xff1a;是直接apt install filezilla&#xff0c;还是去官网下载tar包手动安装&#xff1f;五年前我可能…...

Flutter 轻量存储方案介绍、区别、对比和使用场景

在 Flutter 项目中&#xff0c;本地存储通常可以分为几类&#xff1a; 第一类是轻量 Key-Value 存储&#xff0c;例如 shared_preferences、get_storage、mmkv&#xff0c;适合保存开关、配置、登录状态等简单数据。 第二类是安全存储&#xff0c;例如 flutter_secure_storage&…...

想让你的Linux终端也下起‘代码雨’?手把手教你安装配置cmatrix屏保(CentOS/Ubuntu双系统保姆级教程)

让你的Linux终端下起"代码雨"&#xff1a;cmatrix屏保终极玩法指南 第一次在《黑客帝国》里看到绿色字符如瀑布般倾泻而下的场景时&#xff0c;那种科技感与未来感是否让你心驰神往&#xff1f;现在&#xff0c;你完全可以在自己的Linux终端里复刻这一经典画面。cmat…...