Redis 事务

2023-11-19

Redis 事务

一、Redis事务的概念:

Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。

在这里插入图片描述
上图说明:
假如现在有两个客户端,对同一条数据进行操作,客户端1set了一条数据,完了之后另外一个客户端2更改了这个数据,但是客户端1去get数据时发现获取的值跟自己set的值不一样,是客户端2set的值
针对这样的问题,提出了redis事务

二、redis事务提出的逻辑:

基于上面的问题,那我在一个客户端操作的时候,把所有的指令一次性按照顺序排他的放在一个队列中,执行完了之后再让其他的客户端操作

三、redis事务的基本操作

  • 开启事务

     multi 
    

    作用:设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中

  • 执行事务

    exec 
    

    作用:设定事务的结束位置,同时执行事务。与multi成对出现,成对使用

    注意:加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行
    在这里插入图片描述

    但是你在命令入队列的时候,发现你有些命令指令输入错误,你不想执行了,这个时候,你不想提交事务了

  • 取消事务

    discard
    

    作用:终止当前事务的定义,发生在multi之后,exec之前

    遇到multi指令,创建队列,遇到discard指令销毁队列
    在这里插入图片描述

    若在事务队列中存在命令性错误(类似于java编译性错误),则执行EXEC命令时,所有命令都不会执行
    在这里插入图片描述
    若在事务队列中存在语法性错误(类似于java的1/0的运行时异常),则执行EXEC命令时,其他正确命令会被执行,错误命令抛出异常。
    在这里插入图片描述
    注意:已经执行完毕的命令对应的数据不会自动回滚,需要程序员自己在代码中实现回滚。

四、事务的执行流程

在这里插入图片描述

五、redis锁

业务场景
天猫双11热卖过程中,对已经售罄的货物追加补货,4个业务员都有权限进行补货。补货的操作可能是一系 列的操作,牵扯到多个连续操作,如何保障不会重复操作?

业务分析

  • 多个客户端有可能同时操作同一组数据,并且该数据一旦被操作修改后,将不适用于继续操作
  • 在操作之前锁定要操作的数据,一旦发生变化,终止当前操作

也就是说当有很多个业务员同时对补货key进行操作的时候,我们对这个补货Key进行监控,如果有变动说明有其他的业务员(客户端)已经对补货key这个进行了操作,那么其他人不需要修改,如果没有变动事务执行成功

  • 对 key 添加监视锁,在执行exec前如果key发生了变化,终止事务执行
    watch key1 [key2……] 
    
  • 取消对所有 key 的监视
    unwatch
    

使用watch检测balance,事务期间balance数据未变动,事务执行成功
在这里插入图片描述
使用watch检测balance,在开启事务后(标注1处),在新窗口执行标注2中的操作,更改balance的值,模拟其他客户端在事务执行期间更改watch监控的数据,然后再执行标注1后命令,执行EXEC后,事务未成功执行。
在这里插入图片描述
在这里插入图片描述

  • 一但执行 EXEC 开启事务的执行后,无论事务使用执行成功, WARCH 对变量的监控都将被取消。
  • 故当事务执行失败后,需重新执行WATCH命令对变量进行监控,并开启新的事务进行操作。

六、redis分布式锁

业务场景:
还是上面补货的问题,现在业务员现在已经补货完了,商品热卖,3秒内销售一空,怎么避免最后一件商品不被多人同时购买?
如果使用上面的锁机制(watch),监控这个补货key有没有改变,那是不行的,一旦补货key一变化事务就执行失败,这样的话其他的用户也不能在后面买到,所以这样也是行不通的
虽然redis是单线程的,但是多个客户端对同一数据同时进行操作时,如何避免不被同时修改?

基于这样的问题,提出了redis分布式锁,你加一把锁,每一个用户过来的时候都需要获取这把锁,只有获取这把锁的时候才能操作成功,没有获取锁的话,操作失败。

redis分布式锁的解决方案

  • 使用 setnx 设置一个公共锁
    setnx lock-key value 
    

利用setnx命令的返回值特征,有值则返回设置失败,无值则返回设置成功

  • 对于返回设置成功的,拥有控制权,进行下一步的具体业务操作
  • 对于返回设置失败的,不具有控制权,排队或等待
    操作完毕通过del操作释放锁

但是如果一个用户获取了这把锁一直不释放,那怎么办呢?后面的用户一直等嘛?
解决方案

  • 使用 expire 为锁key添加时间限定,到时不释放,放弃锁
     expire lock-key second 
     pexpire lock-key milliseconds 
    

由于操作通常都是微秒或毫秒级,因此该锁定时间不宜设置过大。具体时间需要业务测试后确认。

  • 例如:持有锁的操作最长执行时间127ms,最短执行时间7ms。
  • 测试百万次最长执行时间对应命令的最大耗时,测试百万次网络延迟平均耗时
  • 锁时间设定推荐:最大耗时120%+平均网络延迟110%
  • 如果业务最大耗时<<网络平均延迟,通常为2个数量级,取其中单个耗时较长即可
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis 事务 的相关文章

随机推荐

  • str计算机中代表什么,STR到底是待机还是休眠

    1 为什么需要待机 休眠 尽管电脑硬件运行速度越来越快 但操作系统的体积也在不断膨胀 使得电脑开 关机时 启动 关闭的程序越来越多 花费时间也越来越漫长 因此如何让电脑能够快速启动 一开机就进入Windows 就成为用户关心的问题 于是 随
  • (代码审计)zzcms前台SQL注入

    1 首先通过Seay源码审计工具发现存在admin ask phpSQL注入漏洞 2 根据提示定位到这段代码
  • Java-static关键词的引入

    Java static关键词的引入 栈 局部变量 堆 new出来的结构 对象 数组 方法区 类的加载信息 静态域 常量池 1 相关概念 静态的 公有的 不属于哪个对象 可以用来修饰 属性 方法 代码块 内部类 当static修饰属性时 按照
  • PMS及应用安装过程分析一

    本文阐释应用安装过程 对于开机过程应用包扫描过程不讲述 请参考网上其他文章 PMS类图 APP安装过程 1 PackageInstallerActivity创建 1 1 getPackageManager 1 2 processPackag
  • python如何检查一个对象是否是可迭代对象

    有的时候我们会记不住python里哪种数据类型是可以迭代的对象 这个时候我们可以使用collections里的Iterable来检查这个实例是否可以迭代 gt gt gt from collections import Iterable 载
  • 某东商品价格抓取

    今天做了一个京东商品价格的需求 整理一下 第一步 打开Chrome浏览器自带抓包工具 选择network选项卡 第二步 按下Ctrl F5 打开search 在里面输入价格 例如图中输入的是1318 00 然后回车就会出现包含价格的接口出现
  • 选频网络的原理

    请高手给我讲解下选频网络的原理 选频电路 2012 09 28 18 23 freechen3 分类 工程技术科学 浏览173次 提问者采纳 2012 09 30 00 07 选频网络是利用谐振原理实现 输入的信号含有各次频率分量 选频网络
  • js扩展jquery对象基元的开发与代码编写

    js扩展jquery对象基元的开发与代码编写 function window undefined var Core function var eventarr var OnPageLoad undefined 获取USER信息 var ge
  • OpenCV:旋转矩形(RotatedRect)

    RotatedRect类是OpenCV的基础类 用于创建旋转矩形 下面是它的构造函数 包含旋转中心点 尺寸大小和旋转角度 构造函数1 RotatedRect const Point2f center const Size2f size fl
  • ​2 万字系统总结,带你实现 Linux 命令自由?

    前言 Linux 的学习对于一个程序员的重要性是不言而喻的 前端开发相比后端开发 接触 Linux 机会相对较少 因此往往容易忽视它 但是学好它却是程序员必备修养之一 如果本文对你有所帮助 请点个 吧 作者使用的是阿里云服务器 ECS 最便
  • redis主从同步,总是显示master_link_status:down的解决方法

    前几天 在修改一台从节点的redis的监听端口后 重启了下redis 发现master link status 很长时间一直都是down状态 查看了redis日志 发现日志里出现很多的 I O error trying to sync wi
  • 解决Java连接MySQL后出现的时区错误问题

    好不容易连接好数据库后 第二天打开运行 发现底下一串报红 The server time zone value is unrecognized or represents more than one time zone 线程 main ja
  • Java中变量的作用域【Java基础】

    最近在看 Thinking in Java 想把Java基础再巩固一下 在博客上遇到的以前没注意到的知识点或者较难的知识点记录下来 与大家分享 Java中的基本类型变量的作用域为 int x 1 变量x的作用域只在大括号内 System o
  • QT文件读取路径

    最近在弄中兴的一个程序大赛 用QT读取XML文件的编程 在编程中发现QT文件读取路径与VS有不同之处 我们提供给QFile的文件路径无非就是绝对路径和相对路径 绝对路径是绝对没问题的 不过相对路径就得小心了 谈到相对路径 需要注意区分进程所
  • MES系统给制造型企业带来了哪些效益

    MES系统要怎么给制造型企业带来效益 在这场剧烈的市场竞争中 制造企业不只要在产品质量和创新上具有竞争优势 而且产品的价格在很大程度上决定了企业的市场竞争力 MES系统如何去打破生产暗箱 建造通明化工厂 提高生产效率 如今 中国工厂存在两大
  • 逃逸闭包和非逃逸闭包

    在使用swift开发 使用闭包作为参数传递到函数中 但是总是默认提示加上 escaping 逃逸闭包 是指闭包在函数结束时 闭包就会随着函数的结束而被释放 非逃逸闭包 是指闭包在函数结束时 逃逸函数 不会随函数的结束而被释放 在该闭包执行后
  • ubuntu 下实现 docker+ovs+quagga搭建网络---bgp

    注 本机上现有quagga镜像 ovs虚拟交换机 2 9 1 docker 18 09 7 实现bgp网络搭建 1 sudo ovs vsctl add br br1 增加一个ovs网桥br1 2 sudo docker images 查看
  • ADFS 概念与基本开发介绍 (1)

    如您转载本文 必须标明本文作者及出处 如有任何疑问请与我联系 me nap7 com ADFS 相关开发技术的中文资料相对匮乏 之前再弄这个东西的时候搞的比较辛苦 因此总结此文档 以解后人之忧 本文会首先介绍与联合身份验证有关的概念及相关的
  • 泰迪杯挑战赛优秀论文-A题-基于数据挖掘的上市公司高送转预测

    目 录 第 1 章 绪论 1 1问题背景 1 2问题重述 1 3本文主要工作与创新点 1 4模型假设 1 5本文研究意义 第 2 章 相关理论 2 1高送转相关知识介绍 2 1 1高送转的实质 2 1 2预测下一年上市公司高送转的一些其他条
  • Redis 事务

    目录 Redis 事务 一 Redis事务的概念 二 redis事务提出的逻辑 三 redis事务的基本操作 四 事务的执行流程 五 redis锁 六 redis分布式锁 Redis 事务 一 Redis事务的概念 Redis 事务的本质是