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

深入学习 Redis - 事务、实现原理、指令使用及场景

目录

一、Redis 事务 vs MySQL事务

二、Redis 事务的执行原理

2.1、执行原理

2.2、Redis 事务设计这么简单,为什么不涉及成 MySQL 那样强大呢?

三、Redis 事务的使用

3.1、使用场景

3.2、具体演示

开启/执行/放弃事务

watch 监控

watch 实现原理

小结


一、Redis 事务 vs MySQL事务


我们熟知的 MySQL,你还记得她的事务特性么?

  1. 原子性:将多个操作打包成一个整体,要么全都执行成功,要么一个都不执行,一旦执行出错,立刻回滚如初.
  2. 一致性:事务执行前后,通过约束和回滚机制,保证数据合理. 例如我去银行给 张三 转账 1 元钱,那么我的卡里就会减少 1 元,张三的卡里就会增加 1 元,不能增加 100 元。
  3. 持久性:事务做出的修改都会存储到硬盘上,不会随着服务器重启而丢失.
  4. 隔离性:事务并发执行,涉及到的一些问题.

Redis 的事务和 MySQL 相比,就像一个“弟弟”~

  1. 原子性:Redis 的事务到底有没有在原子性,存在争议!因为从 Redis 的角度理解就是“把多个操作打包到一起,要么全都执行,要么全都不执行”,也就是说,这里如果中途执行失败,那就失败吧,不会有像 MySQL 那样回滚的操作(也因此,网上有人一部分人说 redis 事务有原子性,一部分说没有原子性,都对,但是要看从那个角度出发了~).
  2. 不具备一致性:redis 没有约束和回滚,事务执行一旦出错,就可能导致不一致的情况.
  3. 不具备持久性:Redis 本身就是内存数据库,数据是存储在内存中的. 虽然 Redis 也有持久化机制,但是这里的持久化机制和事务没有什么直接关系.
  4. 不具备隔离性:Redis 是一个单线程模型的服务器程序,所有的请求 / 事务,都是 “串行” 执行的.

二、Redis 事务的执行原理


2.1、执行原理

Redis 事务的主要意义就是为了 “打包” ,避免其他客户端的命令,插队到其中,那他具体是通过什么实现的呢?Redis 实现事务,是引入了队列(每一个客户端都有),开启事务的时候,客户端输入的命令,就会发给服务器,然后进入都这个队列中,此时并不会立即执行,当收到 “执行事务” 命令的时候,就会把队列中的这些任务按照顺序依次执行(这里是由 Redis 主线程执行的,他会把事务中的操作执行完,再去执行其他客户端).

举个例子,这就像是你去做核酸检测,但是核酸检测是早上 7 点开始,但是你 6 点就来了,还发现已经有一些人在这里排成长队,所以这个时候你只能在去后面排队,不能插队,等到核酸检测开始,并且前面的人都检测完了,才轮到你~

2.2、Redis 事务设计这么简单,为什么不涉及成 MySQL 那样强大呢?

MySQL 的事务之所以能设计的这么强大(原子性、一致性....),背后是付出了很多代价的~

  1. 空间上,要花费跟多的空间来存储更多的数据,例如 MySQL 事务执行中途出错,引发的回滚机制,这种回滚机制也是需要花费空间去记录每条执行的指令是什么,才能进行回滚的.
  2. 时间上,也要有更大的执行开销,比如 MySQL 事务的持久化机制,是存储在硬盘上的,操作缓慢;再例如 MySQL 中事务遇到冲突是进行加锁,加锁也是需要开销的,涉及到用户态到内核态的转化,而且加锁就有可能产生锁竞争,一竞争就会加锁排队,一排队就不知道什么时候释放锁了~

也正因如此,Redis 才有了上场的机会。

三、Redis 事务的使用


3.1、使用场景

如果需要把多个操作打包进行,使用事务就是比较合适的~

比如说以前春运,咱们在网上抢火车票的场景、秒杀...

这里以抢火车票的场景为例:

假设现在有大量的用户都在同一时间段开始抢票,也就是说有多个 Redis 客户端执行执行抢票操作,如下:

获取仓库中剩余的票数;
if(剩余的票数 > 0) {下单成功;商品数量--;
}

这里如果不加任何限制,就有可能引发 “线程安全” 问题~  以前咱们解决线程安全问题,都是通过加锁排队来避免 “插队” 的,而 redis 这里不加锁,也能解决上述问题,直接使用事务即可,如下:

开启事务
get count
if count > 0decr count
执行事务

Ps:Redis 原生的命令中是没有上述这种判断的,但是 Redis 支持 lua 脚本,通过 lua 脚本就可以实现上述的 条件判定,并且也和事务一样是打包批量执行的.

确实,redis 的事务使用场景没有 mysql 事务那么多,并且 redis 如果是按照集群模式部署,是不支持事务的.

3.2、具体演示

redis 的事务是通过以下命令进行控制的

multi        开启事务(读作 “猫体”)
exec         执行事务
discard      放弃当前事务
watch        监控某个 key 是否在事务执行之前发生变化(必须搭配事务使用)
unwatch      放弃监控

开启/执行/放弃事务

开启事务,执行以下命令:

此时开启另一个客户端,查看这几个 key ,会发现这几个 key 并没有被赋值(说明此时还没有执行事务).,如下

如果放弃事务,就相当于什么也没有发生,如下

如果使用 exec,就会按顺序执行事务,如下

watch 监控

watch 就是用来监控某个 key 是否在事务执行之前,发生改变,但必须搭配事务来使用.

如下,用 watch 监控 key1,开启事务,并在执行事务之前,另一个客户端对 key1 进行修改,如下

执行事务后,发现 key 在外部由修改,会返回 nil ,表示事务什么都不会执行,如下

watch 实现原理

watch 的实现,类似于一个 “乐观锁”.

乐观锁,不是某个具体的锁,而是指某一类锁的特性:加锁之前,就会有一个心里预期,预期接下来锁冲突的概论比较低,就像是有些同学,考试前觉得自己平时学的很扎实,因此考试前就轻松一些,少复习一点~

redis 的 watch 就相当于基于 “版本号” 这样的机制,实现 “乐观锁”。

当执行 watch key 的时候,就会给 key 安排一个 版本号,版本号可以理解成一个“整数”,每次在修改 key 的时候,版本号都会 “变大” (这个变大是没有规律的,不是每次都增长1),然后在执行 事务 的时候,就会做出判定,判断当前这个 key 的版本号和最初 watch 的时候,记录的版本号是否一致~

  1. 如果一致,说明当前 key 在事务开启到最终执行这个过程中,没有别的客户端修改,才能真正的执行事务.
  2. 如果不一致,就说明 key 在其他客户端修改过了,因此就直接丢弃事务中的所有操作,最后返回 nil.

Ps:这样的设定,在 CAS 的 ABA 问题中也涉及到过,思想方法和实现上都是非常相似的,例如 CAS 实现自旋锁,就类似版本号设定的实现.

小结


重在学习思想,而不是理论,很多思想都是触类旁通的,当我们未来遇到某一类问题的时候,就可以回想起当时解决问题的思想方法,迎刃而解~

相关文章:

深入学习 Redis - 事务、实现原理、指令使用及场景

目录 一、Redis 事务 vs MySQL事务 二、Redis 事务的执行原理 2.1、执行原理 2.2、Redis 事务设计这么简单,为什么不涉及成 MySQL 那样强大呢? 三、Redis 事务的使用 3.1、使用场景 3.2、具体演示 开启/执行/放弃事务 watch 监控 watch 实现原理…...

异步javaScript

在本文中,我们将解释什么是异步编程,为什么我们需要它,并简要讨论 JavaScript 历史上异步函数是怎样被实现的。 预备知识:基本的计算机素养,以及对 JavaScript 基础知识的一定了解,包括函数和事件处理程序…...

看跨境电商世界区域分布,Live Market教你深入参与跨境创业

随着全球化发展带来互联网技术的进步和平台经济的触角伸向全球,跨境电商越来越成为全球贸易的重要组成部分。根据国际数据公司(IDC)的最新数据显示,全球前五大跨境电商平台分别是亚马逊、阿里巴巴、eBay、Wish和京东全球购。这五家…...

python中的装饰器的真正含义和用法

闭包: 闭包是python中的一个很实用的写法,可以使得用户在函数中调用该函数外的函数的变量,使得该变量常驻于内存中。 闭包函数: 输入是函数,输出也是一个函数。 装饰器的写法是python闭包的语法糖。 面试中经常面…...

opencv基础-38 形态学操作-闭运算(先膨胀,后腐蚀)cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

闭运算是先膨胀、后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。 例如,在图 8-17 中,通过先膨胀后腐蚀的闭运算去除了原始图像内部的小孔(内部闭合的…...

RocketMQ生产者和消费者都开启Message Trace后,Consume Message Trace没有消费轨迹

一、依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.0.3</version> </dependency>二、场景 1、生产者和消费者所属同一个程序 2、生产者开启消…...

JDV背后的技术-助力618 | 京东云技术团队

一、项目介绍 JDV&#xff08;可视化大屏&#xff09;是京东内部搭建可视化大屏的数据工具平台&#xff0c;内置10种模版特效&#xff0c;40种风格各异的图表、导航等组件。与集团其他数据工具打通&#xff0c;支持一站式、自助化、拖拽式搭建大屏&#xff0c;实现数据切换、联…...

0基础学习VR全景平台篇 第78篇:全景相机-拍摄VR全景

新手入门圆周率科技&#xff0c;成立于2012年&#xff0c;是中国最早投身嵌入式全景算法研发的团队之一&#xff0c;亦是全球市场占有率最大的全景算法供应商。相继推出一体化智能屏、支持一键高清全景直播的智慧全景相机--Pilot Era和Pilot One&#xff0c;为用户带来实时畅享…...

Spring MVC简介与概述

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

java基础复习(第六日)

java基础复习(五) 1.是否了解类似 RabbitMQ.kalka 之类的队列服务? 请简述队列取务中的常见要素和使用场景&#xff1f; 了解&#xff0c;队列服务是一种应用间的通信方式&#xff0c;可以实现异步处理、应用解耦、流量削峰和消息通信等功能 队列服务的常见要素&#xff1a…...

商用服务机器人公司【Richtech Robotics】申请纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国内华达州拉斯维加斯由华人领导的商用服务机器人公司【Richtech Robotics】近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&am…...

关于nn.Embedding如何使用预定义词表

直接使用&#xff0c;则是没有pretrained的词表。 若要使用预定义词表&#xff0c;则可以用 pretrained_weight np.array(pretrained_weight) embeds.weight.data.copy_(torch.from_numpy(pretrained_weight))参考&#xff1a; https://wmathor.com/index.php/archives/1435/…...

怎么设置文件夹密码?文件夹密码设置方法合集

为文件夹设置密码可以有效地保护文件夹的数据安全&#xff0c;那么该怎么设置文件夹密码呢&#xff1f;下面我们来一起了解一下。 文件夹保护3000 想要简单快捷的为文件夹设置密码&#xff0c;那么&#xff0c;文件夹保护3000就是最佳的选择。它提供了3种文件夹保护方式&#…...

PEMFC氢氧质子交换燃料电池MATLAB仿真模型

氢氧燃料电池静态模型&#xff1a; &#xff08;1&#xff09;热力学电动势En &#xff08;2&#xff09;活化极化过电势Vact 活化损失主要是因为电极表面的反应速度过慢&#xff0c;在驱动电子传递到或者传送出电极的化学反应时&#xff0c;部分电压会被消耗。 &#xff08;…...

创建PVC注意事项

On the one hand 创建永久卷&#xff08;Persistent Volume Claim&#xff0c;PVC&#xff09;时需要考虑以下几个因素&#xff1a; 存储类别&#xff08;Storage Class&#xff09;&#xff1a;选择适合需求的存储类别是创建 PVC 的第一步。存储类别定义了永久卷的属性&…...

Sencha Ext.NET Crack 快速应用程序的正确工具集

Sencha Ext.NET Crack 快速应用程序的正确工具集 Sencha Ext.NET是一个高级的ASP.NET核心组件框架&#xff0c;它包含了强大的跨浏览器Sencha Ext JS库。通过140多个预构建和专业测试的UI组件实现企业级性能和生产效率。Sencha Ext.NET使用尖端的Web技术创建功能强大的Web应用程…...

transformer学习

transformer 李宏毅老师的课&#xff1a;https://www.youtube.com/watch?vugWDIIOHtPA&listPLJV_el3uVTsOK_ZK5L0Iv_EQoL1JefRL4&index60 知乎上的文章&#xff1a;Transformer模型详解&#xff08;图解最完整版&#xff09; 主要参考tensorflow的官方文档&#xf…...

基于LNMP架构搭建Discuz论坛

LNMP: L---->linux系统&#xff0c;操作系统。 N----->nginx网站服务&#xff08;前端),提供前端的静态页面服务。同时具有代理、转发的作用。&#xff08;转发就是转发后端请求&#xff0c;转发PHP&#xff09;&#xff0c;nginx没有处理动态资源的功能&#xff0c;他有…...

乐鑫科技2021笔试题

笔试时间&#xff1a;2020.09.09&#xff0c;10&#xff1a;00-11&#xff1a;30 岗位&#xff1a;嵌入式软件工程师 题型&#xff1a;单选题20道&#xff0c;40分。编程题2道&#xff0c;60分。 单选题 1、算术右移指令执行的操作是&#xff1f;符号位会变化吗&#xff1f…...

VL 模型 Open-Set Domain Adaptation with Visual-Language Foundation Models 论文阅读笔记

Open-Set Domain Adaptation with Visual-Language Foundation Models 论文阅读笔记 一、Abstract 写在前面 又是一周周末&#xff0c;在家的时间感觉过得很快呀。今天没得时间写博客&#xff0c;留下个标题&#xff0c;明天搞完。 论文地址&#xff1a;Open-Set Domain Adapta…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...