2023.1.19 关于 Redis 事务详解

目录

Redis 事务对比 MySQL 事务

MySQL 事务

Redis 事务

Redis 事务原子性解释

Redis 事务详解

执行流程

典型使用场景

Redis 事务命令

WATCH 的使用

WATCH 实现原理

总结


阅读下文之前建议点击下方链接了解 MySQL 事务详解

MySQL 事务详解


Redis 事务对比 MySQL 事务

MySQL 事务

  • 原子性:将多个操作打包成一个整体,要么全部执行成功,要么全部都不执行,一旦执行出错,立刻回滚如初
  • 一致性:事务执行前后,通过约束和回滚机制,保证数据合理
  • 持久性:事务做出的修改会存储到硬盘上,不会随着服务器重启而丢失
  • 隔离性:事务并发执行,涉及 四大隔离级别

Redis 事务

  • 原子性:Redis 的事务到底有没有原子性 存在争议
  • 不具备一致性:Redis 没有约束,也没有回滚机制,事务操作过程中如果某个修改操作出现失败,就可能引起不一致的情况
  • 不具备持久性:Redis 本身就是内存数据库,数据是存储在内存中的,虽然 Redis 也有持久化机制,但是这里的持久化机制 和 事务没有啥直接关系
  • 不涉及隔离性:Redis 是一个单线程模型的服务器程序,所有的请求 或 事务都是串行执行的

Redis 事务原子性解释

  • 原子性最原本的含义:将多个操作打包到一起,要么全部执行,要么全部不执行
  • Redis 和 MySQL 均做到了原子性最原本的含义

注意:

  • Redis 仅能保证 多个操作全部一起执行或者不执行,但是不保证是否能够执行成功!
  • 即如果事务中若干个操作,存在有失败执行失败的操作,不会进行回滚!!
  • 但是 MySQL 面对上述情况会进行回滚操作,以保证事务的 一致性!

小总结:

  • MySQL 提高了原子性的门槛
  • 这就使得人们谈到原子性的时候,更多的是想到的 MySQL 这种带有回滚机制的原子性
  • 所以 Redis 事务是否具有原子性便存在这样的歧义
  • Redis 事务有原子性:可将多个操作能够打包到一起执行
  • Redis 事务不具有原子性:可将多个操作能够打包到一起执行,但是不具有回滚机制,无法保证这多个操作能够正确的执行

Redis 事务详解

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

  • Redis 引入队列来实现事务,该队列 每个客户端均有一个

执行流程

  • 开启事务
  • 客户端输入命令,命令发给服务器并且插入到队列中,此时的命令不会立即执行
  • 输入 执行事务 命令,队列中的命令 按照顺序依次执行
  • 依次执行的过程,均由 Redis 主线程完成,主线程会把事务中的操作执行完,再去执行其他客户端的命令

问题:

  • Redis 事务为什么这么简单,为啥不设计成和 MySQL 事务一样强大呢?

回答:

  • MySQL 事务在实现上付出了很大的代价
  • 空间上:花费更多的空间来存储更多的数据
  • 时间上:有着更大的执行开销
  • 也正是因为 MySQL 上述的代价,才有了 Redis 上场的机会

典型使用场景

  • 关于超卖问题
  • 一款商品放货 5000 台,如果有 5001 个人下单成功,这便属于超卖

典型写法:

  • 如果不加上任何限制,便可能存在 线程安全 问题
  • 在多线程中,均通过加锁的方式,来避免 插队

Redis 事务写法:

  • Redis 本身就是一个单线程模型,所以其天然不具有线程安全问题
  • 所以此处我们直接使用 Redis 事务,将购买商品所需进行的流程打包到一起执行即可

注意:

  • Redis 服务器只有收到 执行事务 命令的时候 才会真正执行 事务队列中的命令 !

具体理解:

  • 只有客户端B 的 执行事务 命令发过来之后,服务器才会真正执行客户端B 的事务队列
  • 与此同时 客户端A 的事务队列已经执行完成
  • 则 客户端B 事务队列中 get 到的 count 就已经是 客户端A 事务队列执行完之后的结果
  • 即采用 Redis 事务方法 无需加锁也能解决上述超卖问题

小总结:

  • Redis 事务的应用场景没有 MySQL 事务那么多
  • Redis 如果是按照集群模式部署的,则不支持事务

问题:

  • Redis 命令中能进行条件判定吗?

回答:

  • Redis 原生命令中确实没有像 if 这种的条件判定
  • 但是 Redis 支持 lua 脚本
  • 通过 lua 脚本便可以实现上述实例那样的条件判定,并且和事务一样,也是打包批量执行
  • lua 脚本的实现方式是 Redis 事务的进阶版本

Redis 事务命令

MULTI     开启事务
exec      执行事务
discard   放弃当前事务
watch     监控某个 key 是否在事务执行之前发送变化
unwatch   放弃监控

实例理解

  • 此处演示正确执行一个 Redis 事务

  • 此处演示放弃执行一个 Redis 事务


问题:

  • 开启事务,给服务器发送若干个命令后,此时服务器重启,那么该事务将会如何呢?

回答:

  • 上述场景的效果就等同于 discard


WATCH 的使用

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

实例理解

  • 从时间上来看,客户端A 先发送 set key 222,客户端B 后发送 set key 333
  • 但是由于 客户端A ,只有执行了 exec 命令,才会真正执行 set key 222 命令
  • 即 exec 命令 比 客户端B 的 set key 333 命令后执行
  • 所以上图中,key 的最终值为 222

注意:

  • 上述场景便可使用 watch 命令来监控这个 key
  • 看看这个 key 在事务 MULTI 和 exec 之间,是否被 外部其他客户端修改


WATCH 实现原理

  • watch 的实现 类似于一个 乐观锁
  • Redis 的 watch 命令相当于基于 版本号 这样的机制来进行实现的乐观锁

  • 这样的设定 在 CAS 这里 ABA 问题中也涉及过 思想方法 还是 实现上都是非常相似的

总结

  • Redis 事务,要比 MySQL 事务要简单很多
  1. 原子性:Redis 事务,不支持回滚
  2. 一致性:Redis 并不会保证事务执行前和执行后,数据统一
  3. 持久性:Redis 主要通过内存来存储数据
  4. 隔离性:Redis 自身作为一个单线程的服务器模型,上面处理的请求本质上都是串行执行的

  • Redis 中的 lua 脚本,也能起到类似于事务的效果
  • 官方网站上,事务这里的任何能实现的效果,都可以使用 lua 脚本代替

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

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

相关文章

[陇剑杯 2021]jwt

[陇剑杯 2021]jwt 题目做法及思路解析(个人分享) 问一:昨天,单位流量系统捕获了黑客攻击流量,请您分析流量后进行回答: 该网站使用了______认证方式。(如有字母请全部使用小写&#xff09…

C++ 设计模式之备忘录模式

【声明】本题目来源于卡码网(题目页面 (kamacoder.com)) 【提示:如果不想看文字介绍,可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 -- 什么是备忘录模式 (第17种模式) 备忘录模式(Meme…

【C语言】- 设置控制台标题、编码、文字颜色、大小和字体

【C语言】- 设置控制台标题、编码、文字颜色、大小和字体 文章目录 【C语言】- 设置控制台标题、编码、文字颜色、大小和字体1 - 设置控制台标题2 - 设置控制台编码3 - 设置控制台字体和大小参考链接 1 - 设置控制台标题 因为要用到 Windows API,所以需要包含头文件…

UI组件在线预览,程序员直呼“不要太方便~”

一、介绍 以往大家如果想查看组件的使用效果,需要打开DevEco Studio构建工程。现在为了便于大家高效开发,文档上线了JS UI组件在线预览功能,无需本地构建工程,在线即可修改组件样式等参数、一键预览编译效果。程序员直呼&#xff…

可视化k8s页面(Kubepi)

Kubepi是一个简单高效的k8s集群图形化管理工具,方便日常管理K8S集群,高效快速的查询日志定位问题的工具 随便在哪个节点部署,我这里在主节点部署 docker pull kubeoperator/kubepi-server docker run --privileged -itd --restartunless-st…

RabbitMQ-生产者可靠性

一、生产者重连 1、概念 由于网络波动导致客户端无法连接上MQ,这是可以开启MQ的失败后重连机制。 注意: 是连接失败的重试,而不是消息发送失败后的重试。 2、开启配置 spring:rabbitmq:template:retry:enabled: true # 是否启用重试机制ma…

【RabbitMQ】RabbitMQ安装与使用详解以及Spring集成

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《RabbitMQ实战》。🎯🎯 &am…

java实现红黑树

红黑树 红黑树是一种自平衡二叉查找树,其中每个节点都有一个颜色属性,颜色为红色或黑色。它的特性保证了树在插入和删除操作后仍然保持大致的平衡,使得查找操作能够在对数时间内完成。以下是红黑树的一些基本性质: 每个节点是红…

面试题16.15.珠玑妙算

前言 这两天突然发现力扣上还是有我能写出来的题的,虽说都是简单级别的(以及一道中等的题),但是能写出来力扣真的太开心了,(大佬把我这段话当个玩笑就行了),于是乎,我觉…

C#,入门教程(21)——命名空间(namespace)与程序结构的基础知识

上一篇: C#,入门教程(20)——列表(List)的基础知识https://blog.csdn.net/beijinghorn/article/details/124094382 编写软件(大软件称为系统)与盖大楼一个道理。 假设咱们现在需要盖一座名为“天梯大厦”的…

kubernetes工作负载-DamonSet

一、DemonSet的介绍 1、什么是DemonSet DaemonSet 控制器是用来保证在所有节点上运行一个 Pod 的副本当有节点加入集群时, 也会为他们新增一个 Pod。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。 简而言之…

进入docker容器,vi: command not found

问题描述: 进入docker容器,查看文件执行vim 命令,报错 vim: command not found。搜索解决方案,说执行一下 apt-get install vim命令,然后又报错 Unable to locate package vim。 解决: 1.执行 npt-get up…

YOLOv3:算法与论文详细解读

【yolov1:背景介绍与算法精讲】 【yolo9000:Better, Faster, Stronger的目标检测网络】 目录 一、YOLOv3概述二、创新与改进三、改进细节3.1 多尺度特征3.2 不同尺度先验框3.3 完整的网络结构3.3 Darknet-53主干网络3.4 残差网络3.4.1 恒等映射3.4.2 网络…

git提交代码到远端仓库的方法详解

一、何为git git就是版本控制器,就比如说你新建了一个git文件夹,里面用于存放你的C语言实习报告,现在要用git对该文件夹进行接管。当你修改了你的C语言实习报告点击保存之后,就用git的相关命令,提交给git,让…

go语言(十)---- 面向对象封装

面向对象的封装 package mainimport "fmt"type Hero struct {Name stringAd intLevel int }func (this Hero) Show(){fmt.Println("Name ", this.Name)fmt.Println("Ad ", this.Ad)fmt.Println("Level ", this.Level)}func (thi…

priority_queue的使用与模拟实现(容器适配器+stack与queue的模拟实现源码)

priority_queue的使用与模拟实现 引言(容器适配器)priority_queue的介绍与使用priority_queue介绍接口使用默认成员函数 size与emptytoppush与pop priority_queue的模拟实现构造函数size与emptytoppush与pop向上调整建堆与向下调整建堆向上调整建堆向下调…

个人实现的QT拼图游戏(开源),QT拖拽事件详解

文章目录 效果图引言玩法 拖拽概念基本概念如何在Qt中使用拖放注意事项 游戏关键问题总结 效果图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c6dd66befd314442adf07e1dec0d550c.png 引言 在学习QT demo时,发现有一个拼图demo,介绍拖…

【算法Hot100系列】跳跃游戏

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

Linux搭建dns主从服务器

一、实验要求 配置Dns主从服务器,能够实现正常的正反向解析 二、知识点 1、DNS简介 DNS(Domain Name System)是互联网上的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网。…

磁的基本知识

磁的基本知识。 一、磁铁及其基本性质。 1、磁铁的概念。 具有吸引铁、钴、镍等金属能力的物质叫做磁体,俗称磁铁、吸铁石。被吸引的铁、钴、镍等物质叫做铁磁性材料。磁铁吸引铁磁性材料的性质叫做磁性。 2、磁铁的分类。 磁铁可分为天然磁铁和人造磁铁两种。天然…