Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习

news2024/11/27 1:21:15

🧸欢迎来到dream_ready的博客,📜相信您对这篇博客也感兴趣o (ˉ▽ˉ;)

📜redis和缓存及相关问题和解决办法 什么是缓存预热、缓存穿透、缓存雪崩、缓存击穿

目录

    1、复习 MySQl 事务的特性

    2、Redis 事务特性

  2.1、原子性(有没有存在争议)

  2.2、一致性、持久性、隔离性(没有)

    3、redis事务举生活例子

    4、redis事务的实现方式

    5、redis的事务为什么搞得这么简单? 为什么不涉及成和MySQL一样强大呢

    6、什么时候需要使用到redis的事务呢?以及redis事务的相关逻辑

    7、redis事务的具体命令操作

    8、WATCH —— 监控key


1、复习 MySQl 事务的特性

  • 原子性:事务是原子的,它被视为一个不可分割的工作单元。事务中的所有操作要么全部执行成功,要么全部失败回滚,不存在中途状态。原子性确保了数据库的一致性。
  • 一致性:事务执行之前,和之后,数据都不能离谱,维护数据库的一致性,和原子性密切相关
  • 持久性:一旦事务提交,其结果应该是永久性的(存硬盘),即使在系统发生故障的情况下也不会丢失。数据库的持久性保证了数据的长期存储。
  • 隔离性:多个事务可以并发执行,但其结果必须与按某种顺序串行执行的结果一致。隔离性确保一个事务的执行不会被其他事务干扰,通过隔离性可以避免一些并发引起的问题,如脏读(dirty read)、不可重复读(non-repeatable read)和幻读(phantom read)

一致性举例:在一个mysql的事务操作中,事务要么全部执行成功,要么全部失败回滚,不可以有的成功,有的失败,以维护数据库的一致性

2、Redis 事务特性

2.1、原子性(有没有存在争议)

  • 最原本的含义,是把多个操作打包到一起,要么全部执行,要么全部不执行
  • Redis 确实做到了上述的含义,但如果事务中若干个操作,存在有失败的,那就失败吧,不会有回滚操作
  • 相比来说MySQL这里的原子性,走得更远,也是把多个操作打包到一起,要么全都执行成功,要么全都不执行
  • 如果mysql的事务中有操作执行失败,则进行回滚!把中间已经执行的操作,全都回退了
  • 不得不说,MySQL在这方面成为了“标兵”,提高了“原子性”的门槛
  • 这就使人们谈到原子性的时候,更多的是想到的MySQL这种带有回滚的原子性

网上看到,有的人说,redis事务有原子性,有的说没有原子性

  • 说有原子性的原因是因为:它确实满足了原子性最基本的含义,将任务打包执行(也只是打包一起执行了)
  • 说没有原子性的原因是因为:它没有满足mysql那种事务原子性的操作,他们认为原子性应该是打包一起执行+带有回滚,而明显,redis只是打包一起执行,失败不回滚,这种操作不被他们认为是原子性

2.2、一致性、持久性、隔离性(没有)

不具备一致性:redis没有约束,也没有回滚机制,事务执行过程中如果某个修改操作出现失败,就可能引起不一致的情况

不具备一致性:redis本身就是内存数据库,数据是存储在内存中的。虽然redis也有持久化机制,但是这里的持久化机制,和事务没有什么直接关系

不具备隔离性:redis是一个单线程模型的服务器程序,所有的请求/事务,都是“串行”执行的(多线程涉及隔离性,redis单线程,和隔离性扯不到一起)

Redis 的事务,主要的意义,就是为了“打包”,避免其他客户端的命令,插队插到中间

3、redis事务举生活例子

  • 我生日这一天,我和媳妇约好了,晚上出去吃烧烤
  • 但是呢,女人嘛,出门是一件麻烦的事情 (化妆...)
  • 我就先到了烧烤店,点了牛肉串若干,羊肉串若干,五花肉若干,点完之后,我告诉服务员,“我这人还没齐,你先把单下着,但是先不着急烤”
  • 过了一会,我媳妇到了,她又加了一盘烤韭菜,又加了两个烤腰子
  • 随后,我告诉服务员:开始考吧!
  • 此时,先点的这些肉 和 后点的韭菜、腰子 是一起烤的
  • 这两组中间,是没有被插队的
  • 这个不插队,不是先抢占位置,而是先让出位置

其实,这就是redis事务一种典型体现,将若干命令打包到一起执行,而且redis事务的执行逻辑也是不立即执行(不抢占位置),下发执行该事务命令后,redis会把当前正在做的事情(比如已经在执行一个事务,会把这个事务做完)做完后,再执行这个事务

4、redis事务的实现方式

  • redis中实现事务,是引入了队列(每个客户端都有一个)
  • 开启事务的时候,此时客户端输入的命令,就会发给服务器并且进入这个队列中(而不是立即执行)
  • 当遇到了“执行事务”命令的时候,此时就会把队列中的这些任务都按照顺序依次执行
  • 这些任务都是在redis主线程中完成的,主线程会把事务中的操作都执行完,再处理别的客户端

5、redis的事务为什么搞得这么简单? 为什么不涉及成和MySQL一样强大呢

  • MySQL的事务,在背后付出了很大的代价
  • 空间上,要花费更多的时间来存储更多的数据
  • 时间上,也要有更大的执行开销
  • 正是因为MySQL上述的问题,才有了redis上场的机会
  • redis想要效率高,必须舍弃掉一些功能

总结: 鱼和熊掌不可兼得

6、什么时候需要使用到redis的事务呢?以及redis事务的相关逻辑

如果我们把多个操作打包进行,使用事务是比较合适的

比如当我们秒杀商品时,商家放货了5000台,实际如果让5001个人下单成功,就是超卖了

在秒杀商品等情况下就需要redis、的事务了

把每个用户点击购买直到完全下单成功并且商家货物减少这一整个操作合成一个事务进行执行

以前在多线程中,是通过加锁的方式,来避免“插队”的,在redis中就直接使用事务,即可!

逻辑如下:

7、redis事务的具体命令操作

事务三大基本命令 —— 开启、执行、放弃 

  • 开启事务   ——   MULTI
  • 执行事务   ——   EXEC
  • 放弃当前事务   ——  DISCARD
  • 开启事务(multi)后,可以编写事务中的具体操作,这些操作不会被执行,但会加入到这个事务中,待执行命令EXEC后 ,redis会着手执行该事务,即依次执行该事务中的所有命令语句
  • discard表示放弃当前事务,相当于刚才没有进行对事务的操作

redis中的 lua 脚本,也能起到类似于事务的效果

官方网站上说,事务这里的任何能实现的效果,都可以使用 lua 脚本代替

代码举例:

  • 当开启事务,并且给服务器发送若干个命令之后,此时服务器重启,此时的这个事务咋办?
  • 此时的效果就等同于discard

8、WATCH —— 监控key

watch 监控某个key是否在事务执行之前,发生了改变

刚才的场景中,就可以使用watch命令来监控这个key

看看这个key在事务的 multi 和 exec 之间,set key 之后,是否在外部被其他客户端修改了 

watch开启后,在 NULTI 和 exec间另一个 redis客户端对 key进行了修改,此时提交事务,事务中对 key的操作就不会真正被执行!

watch 的实现原理,类似 “乐观锁”

watch 可以监测一个 key,也可以监测多个 key

乐观锁、悲观锁不是指某个具体的锁,而是指的是某一类锁的特性

  • 乐观锁:加锁之前,就有一个心理预期,预期接下来锁冲突的概率比较低
  • 悲观锁:加锁之前,也有一个心理预期,接下来锁冲突的概率比较高

锁冲突指的是两个线程针对同一个锁加锁,一个能加锁成功,另一个就得阻塞等待

watch的原理:

  • 当执行 watch key 的时候
  • redis就会给这个key安排一个版本号
  • 版本号可以理解成一个“整数”
  • 每次在修改的时候,版本号就会“变大”
  • 然后在执行 事务 中命令的时候
  • 就会做出判定
  • 判定这个key的版本号,和最初 watch 的时候
  • 记录的版本号是否一致!!!
  • 如果一致,说明当前key在事务开启到最终执行这个过程中,没有别的客户端修改,于是才能真正执行这个事务 
  • 如果不一致,说明key在其他客户端中改过了,因此此处就直接丢弃事务中的操作,exec返回nil(空)

逻辑图及相关解释如下: 

简单解释CAS和ABA,若不理解可以私信博主或者自行查询:

  • Redis Watch 命令给事务提供check-and-set (CAS) 机制。被Watch的Key被持续监控,如果key在Exec命令执行前有改变,那么整个事务被取消。
  • ABA问题是CAS机制的缺陷,大概意思是 A(旧值)-->B(新值)-->A(新值)  cas乐观锁会认为A没被修改。 但是redis的watch在这种情况下,依然会提示watch key被修改,事务失败。

 🧸欢迎您于百忙之中阅读这篇博客,📜希望这篇博客给您带来了一些帮助,祝您生活愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1207913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Debug知识点解析!超实用教程

一、Debug简介 二、IDEA中的Debug步骤 2.1 步过调试按钮(F8) 2.2 步入调试按钮(F7) 2.3 强制步入调试按钮(Alt Shift EZ) 2.4 步出调试按钮(Shift F8) 2.5 回退断点 2.6 运行到光标处(F9) 2.7 计算表达式按钮(Alt F8) 三、条件断点 在断点处右…

Project IDX简介——这是一项改进全栈、多平台应用程序开发的试验

如今,将应用程序从零开发到生产环境(尤其是在移动、网络和桌面平台上运行良好的应用程序)感觉就像构建一台 Rube Goldberg 机器。您必须在无尽的复杂性海洋中航行,将各种技术堆栈粘合在一起,以引导、编译、测试、部署和…

基于逐次变分模态分解(SVMD)联合小波阈值去噪

代码原理 逐次变分模态分解 (Iterative Variational Mode Decomposition, IVMD) 是一种信号分解方法,它可以将一个时域信号分解为若干个本征模态函数(Intrinsic Mode Functions, IMF)。它通过迭代寻找信号的本征模态函数和残差部分&#xff…

Ladybug 全景相机, 360°球形成像,带来全方位的视觉体验

360无死角全景照片总能给人带来强烈的视觉震撼,有着大片的既视感。那怎么才能拍出360球形照片呢?它的拍摄原理是通过图片某个点位为中心将图片其他部位螺旋式、旋转式处理,从而达到沉浸式体验的效果。俗话说“工欲善其事,必先利其…

.net core中前端vue HTML5 History 刷新页面404问题

放到启动的应用程序的最后面 app.Run(async (context) > {context.Response.ContentType "text/html";await context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "index.html")); });https://blog.csdn.net/lee576/article/details/88355…

强化学习:原理与Python实战||一分钟秒懂人工智能对齐

文章目录 1.什么是人工智能对齐2.为什么要研究人工智能对齐3.人工智能对齐的常见方法延伸阅读 1.什么是人工智能对齐 人工智能对齐(AI Alignment)指让人工智能的行为符合人的意图和价值观。 人工智能系统可能会出现“不对齐”(misalign&…

647. 回文子串 516.最长回文子序列

647. 回文子串 题目: 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是由相…

ubuntu18.04配置Java环境与安装RCS库

一、安装包 安装包 二、JAVA环境 java无需安装,只需要下载解压,然后配置正确的路径到环境变量种即可使用。 1.创建文件JAVA mkdir JAVA 2.将安装包复制到该文件夹下,并解压缩 tar -zxvf tar -zxvf jdk1.8.0_191.tar.gz 3.在home路径下…

ubuntu小技巧30--23.10桌面版安装钉钉启动报错undefined symbol: FT_Get_Color_Glyph_Layer

ubuntu小技巧30-- 23.10桌面版安装钉钉启动报错undefined symbol: FT_Get_Color_Glyph_Layer 介绍解決方法说明 介绍 近期在电脑上安装了 ubuntu 23.10桌面版本, 安装最新版钉钉后无法正常打开软件,报错 undefined symbol: FT_Get_Color_Glyph_Layer ,具…

sqlyog安装和网址

网址Downloads webyog/sqlyog-community Wiki GitHub 1. 2. 3. 4. 5. 6. 7.

手写一个starter

文章目录 starter命令规则项目演示新建工程Pom引入依赖定义属性配置定义自动配置类配置EnableAutoConfiguration业务实现项目中使用 什么是Starter?Starter其实就是我们经常在maven中的导入的各种模块,自定义Starter可以快速的满足开发的需求&#xff0c…

SOME/IP学习笔记3

目录 1.SOMEIP Transformer 1.1 SOME/IP on-wire format 1.2 协议指定 2. SOMEIP TP 2.1 SOME/IP TP Header 3.小结 1.SOMEIP Transformer 根据autosar CP 相关规范,SOME/IP Transformer主要用于将SOME/IP格式的数据序列化,相当于一个转换器。总体…

1、NPC 三电平SVPWM simulink仿真

1、SVPWM时间计算函数,是从matlab的SVPWM3L_TimingCalculation.p文件中反汇编出来的函数: function [TgABC_On ,TgABC_Off ,Sn ]SVPWM3L_TimingCalculation_frompfile (Vref ,DeltaVdc ,Fsw ) %#codegen %coder .allowpcode (plain ); TgABC_On [0 ,0 ,…

超级 App 的前端框架也可以足够轻量

小程序技术自微信2016年提出并大力推动,如今已经成为了中国前端研发的“潮流”,或者说是“趋势”。早期,微信小程序是微信公众平台推出的一种应用形态。微信小程序开放平台允许开发者在微信内直接开发和发布应用,用户无需下载安装…

使用Python轻松实现科研绘图

当撰写在学术期刊上发表的文章时,图表的布局和风格应符合预定义的格式要求。这样可以确保该出版物的所有文章都具有一致的风格,并且任何包含的图表在打印时都是高质量的。 Python在科学界广泛使用,并提供了创建科学绘图的好方法。然而&#…

如何正确使用 JavaScript 中的 slice() 方法

在 JavaScript 中,slice() 是一个常用的数组方法,用于从现有数组中提取一部分元素,然后返回一个新的数组。它是一个非常有用的工具,可以帮助你在不改变原始数组的情况下操作数组的子集。本文将介绍 slice() 的基本概念、使用方法、…

云课五分钟-02第一个代码复现-终端甜甜圈C++

前篇 云课五分钟-01课程在哪里-无需安装网页直达- 代码复现通过云课,会非常快捷。 视频 云课五分钟-02第一个代码复现-终端甜甜圈C 文本 如何使用g 使用g编译和链接C程序的基本步骤如下: 编写源代码:首先,你需要编写C源代码&…

关于dinput8.dll丢失的问题,提供六种解决办法

不知dinput8.dll文件大家是否有所了解,或者你的电脑中是否出现过关于dinput8.dll文件丢失问题。如果你的电脑中出现了关于dinput8.dll丢失的问题,那么这篇文章给大家提供六种解决dinput8.dll丢失的办法。希望能够帮助大家解决dinput8.dll丢失。 一.dinpu…

XETUX 软件 dynamiccontent.properties.xhtml 远程代码执行漏洞

XETUX 软件 dynamiccontent.properties.xhtml 远程代码执行漏洞 一、漏洞描述二、FOFA资产三、漏扫复现自动化检测 四、修复建议 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果…

在PKPM中主梁与次梁有哪些区别?

在PKPM中主梁与次梁有哪些区别? 一、按主菜单1输入次梁比较方便,按主菜单2输入的次梁只能以房间为单元输入,比较麻烦; 二、按主菜单1输入次梁会增加大量无柱连接节点,增加大量房间,平面房间碎小&#xff…