2023.1.19 关于 Redis 事务详解

news2024/11/15 10:53:37

目录

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.coloradmin.cn/o/1397819.html

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

相关文章

探索设计模式的魅力:一篇文章让你彻底搞懂建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,旨在将一个复杂对象的创建过程与其表示分离,使得同样的构建过程可以创建不同的表示形式。 主要角色: 产品(Product):表示正在构建…

小程序系列--9.生命周期

1. 什么是生命周期? 2. 生命周期的分类 3. 什么是生命周期函数 4. 生命周期函数的分类 5. 应用的生命周期函数 6. 页面的生命周期函数

SpringCloud Aliba-Sentinel【中篇】-从入门到学废【5】

目录 1.流控规则 2. 熔断规则 3.热点规则 1.流控规则 1.资源名:唯一名称,默认请求路径 2.针对来源: Sentinel可以针对调用者进行限流,填写微服务名,默认default (不区分来源) 3.阈值类型/单机阈值: QPS(每秒钟的请求数量&…

pytorch学习(一)线性模型

文章目录 线性模型pytorch使用sklearn训练 pytorch是一个基础的python的科学计算库,它有以下特点: 类似于numpy,但是它可以使用GPU可以用它来定义深度学习模型,可以灵活的进行深度学习模型的训练和使用 线性模型 线性模型的基本形…

Studio One2024免费版下载及入门教程分享

众所周知,Studio One是一个专业的音频编辑软件,近几年随着音视频剪辑越来越火,Studio One也逐渐被人们所熟知。最近,就有许多小伙伴私信我,寻求Studio One的入门教程。 这不,今天小编就给大家带来了音频剪…

iphone5s基带部分电源部分主主电源供电及

时序: 1.,基带电源的供电,基带电源也叫pmu。 首先时序图说电池提供供电,电池是J6接口,视频习惯把接口称之为座子。查U2_RF芯片,发现供电信号为PP_BATT_VCC_CONN,但是没查到跟电池座子有关系,电池座子写的是…

Flask框架小程序后端分离开发学习笔记《1》网络知识

Flask框架小程序后端分离开发学习笔记《1》网络知识 Flask是使用python的后端,由于小程序需要后端开发,遂学习一下后端开发。 一、网址组成介绍 协议:http,https (https是加密的http)主机:g.cn zhihu.com之类的网址…

Python使用pyechart分析疫情确诊人数图(2024)

import json from pyecharts.charts import Map from pyecharts import options as opts# 首先打开文件获取数据 f open("/Desktop/python/Project/数据可视化/疫情.txt", "r", encoding"UTF-8") data f.read()# 字符串转化成json数据 data_js…

rust使用protobuf

前言 c,java,go 等直接是用 ,具体就不说了,这章主要讲述rust 使用protobuf 这章主要讲述2种 1 > protoc protoc-gen-rust plugin 2> protoc prost-build 1:环境 win10 rustrover64 25-2 下载地址 https://github.com/protocolbu…

CHS_01.2.2.1+调度的概念、层次

CHS_01.2.2.1调度的概念、层次 调度的概念、层次知识总览调度的基本概念调度的三个层次——高级调度![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6957fdec179841f69a0508914145da36.png)调度的三个层次——低级调度调度的三个层次——中级调度补充知识&#xff…

unity-声音与声效OLD

声音与声效 基本概念audio clipaudio listeneraudio source 基本操作如何创建音频源(背景音乐)如何在测试的时候关闭声音 常用代码一般流程如何在一个物体上播放多个音效如何在代码中延时播放多个声音如何在代码中停止音频的播放如何判断当前是否在播放音…

Web3解密:区块链技术如何颠覆传统互联网

随着区块链技术的崛起,Web3正逐渐成为新一代互联网的代名词。它不再依赖中心化的权威机构,而是通过去中心化、透明、安全的特性,为用户带来更为开放和公正的互联网体验。本文将深入解密Web3,揭示区块链技术如何颠覆传统互联网的基…

Linux搭建dns主从服务器

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

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

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

ctfshow命令执行(web29-web52)

目录 web29 web30 web31 web32 web33 web34 web35 web36 web37 web38 web39 web40 web41 web42 web43 web44 web45 web46 web47 web48 web49 web50 web51 web52 web29 <?php error_reporting(0); if(isset($_GET[c])){$c $_GET[c];if(!preg_match…

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…

模型的 F1 分数

模型的 F1 分数是一个综合评估模型性能的指标&#xff0c;同时考虑了模型的精确率&#xff08;Precision&#xff09;和召回率&#xff08;Recall&#xff09;。F1 分数的计算公式为&#xff1a; 其中&#xff1a; Precision 是模型正确识别为正例的样本数量与所有被模型识别为…

PYG中torch_scatter, torch_sparse等pip安装包错解决

原安装命令&#xff1a; pip install pyg_lib torch_scatter torch_sparse torch_cluster torch_spline_conv -f https://data.pyg.org/whl/torch- 1.13.0cu117.html报错&#xff1a; 正确安装命令&#xff1a; pip install --no-index pyg_lib torch_scatter torch_sparse …

JavaWeb:servlet+jsp+mybatis商品管理增删改查

文章目录 1、环境准备1.1、创建数据库1.2、创建项目导入依赖1.3、创建包1.4、创建实体类1.5、准备mybatis环境1.6、编写Mybatis工具类1.7、编写主页面 2、功能实现2.1、查询所有2.2、添加功能2.3、修改数据回显2.4、修改数据2.5、删除数据 1、环境准备 1.1、创建数据库 CREAT…

Python文件自动化处理

os模块 Python标准库和操作系统有关的操作创建、移动、复制文件和文件夹文件路径和名称处理 路径的操作 获取当前Python程序运行路径不同操作系统之间路径的表示方式 windows中采用反斜杠(\)作为文件夹之间的分隔符 Mac和Linux中采用斜杠(/)作为文件夹之间的分隔符 把文件…