中间件_Redis_06_Redis的事务

Redis事务实现 Redis事务通过MULTIEXEC和WATCH等命令实现,具有简单、高效的特点。然而,它并不完全支持ACID属性中的所有要求,特别是在原子性和持久性方面存在一定的限制。因此,在使用Redis事务时,需要根据具体的应用场景和需求进行权衡和选择。 阅读详情

Redis事务

1、事务简介

问题:Redis执行指令的过程中,多条连续执行的指令被干扰,打断,插队,如何解决?

redis事务的概念:redis事务就是一个命令执行的队列,将一系列预定义命令包装成(一个整体)一个队列。

当执行的时候,一次性按照顺序依次执行,中间不会被打断,即一个队列中,一次性、顺序性、排他性地执行一系列命令。


2、事务基本操作

2.1、事务的基本操作

# 开启事务
multi

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

# 执行事务
exec

# 作用
设定事务的结束位置,同时执行事务。

# 注意:
1. multi和exec成对出现,成对使用
2. 加入事务的命令先存放到任务队列中,并没有立即执行,只有执行exec命令才开始执行

问题:事务定义的过程中发现出现了问题,怎么办?

解决方案:

# 取消事务
discard

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

2.2、事务的工作流程

在这里插入图片描述


2.3、事务的注意事项

问题1:定义事务的过程中,命令格式输入错误怎么办?

  • 语法错误

    指命令书写格式有误

  • 处理结果

    定义的事务中所包含的命令存在语法错误,整体事务中所有命令均不会执行。包括那些语法正确的命令

问题2:定义事务的过程中,命令执行出现错误怎么办?

  • 运行错误

    指命令格式正确,但是无法正确的执行。例如,对list进行incr操作

  • 处理结果

    能够正确运行的命令会执行,运行错误的命令不会被执行

注意:已经执行完毕的命令对应的数据不会自动回滚,需要自己实现回滚。


2.4、手动进行事务回滚

  1. 记录操作过程中,被影响的数据之前的状态
    • 单数据:string
    • 多数据:hash、list、set、zset
  2. 设置指令,恢复所有被修改的项
    • 单数据:直接set(注意周边属性,例如时效)
    • 多数据:修改对应值或整体克隆赋值

3、锁

3.1、基于特定条件的事务执行——锁

业务场景:

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

业务分析:

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

解决方案:

# 对key添加监视锁,在执行exec前如果key发生变化,终止事务执行
watch key1 [key2] ……

# 取消对所有key的监视
unwatch

Tips:Redis应用在基于状态控制的批量任务执行


3.2、基于特定条件的事务执行——分布式锁

业务场景:

  • 天猫双11热卖过程中,对已经售罄的货物追加补货,且补货完成。客户购买热情高涨,3秒内将所有商品购买完毕。本次补货已经将库存全部清空,如何避免最后一件商品不被多人同时购买?【超卖问题】

业务分析:

  • 使用watch监控一个key有没有改变已经不能解决问题,此处要监控的是具体数据
  • 虽然redis是单线程的,但是多个客户端对同一数据同时进行操作时,如何避免不被同时修改?

解决方案:

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

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

  • 对于返回设置成功的,拥有控制权,进行下一步的具体业务操作
  • 对于返回设置失败的,不具有控制权,排队或者等待

操作完毕通过del操作释放锁

注意:上述解决方案是一种设计概念,依赖规范保障,具有风险性

Tips:Redis应用在基于分布式锁对应的场景控制


3.2、基于特定条件的事务执行——分布式锁改良

业务场景:

  • 依赖分布式锁的机制,某个用户操作时对应客户端宕机,且此时已经获取到锁。如何解决?

业务分析:

  • 由于锁操作由用户控制加锁解锁,必定会存在加锁后未解锁的风险
  • 需要解锁操作不能仅依赖用户控制,系统级别要给出对应的保底处理方案

解决方案:

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

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

  • 例如:持有锁的操作最长执行时间127ms,最短执行时间7ms。
  • 测试百万次最长执行时间对应命令的最大耗时,测试百万次网络延迟平均耗时
  • 锁时间设定推荐:最大耗时 x 120% + 平均网络延迟 x 110%
  • 如果业务最大耗时<<网络平均延迟,通常为2个数量级,取其中单个耗时较长即可

腾讯云服务器被攻击,带宽被占满的抗战日记 故事 时间:2021-08-23 地点:腾讯云服务器 事件:服务器内容被黑,修复后某人气不过,开始DDOS,占满服务器的带宽,导致网站访问非常缓慢。 杂记 根据腾讯云后台+宝塔后台,带宽被占满:(小垃圾水管没办法) 部分参考:记一次阿里云服务器ECS流出带宽占满的解决过程 https://blog.youkuaiyun.com/wangzhihao1994/article/details/99563456 首先是在云主机上使用远程连接访问到云主机,安装iftop工具 CentOS . 阅读详情

相关推荐

Windows11安装Ubuntu 20.04.3 LTS双系统(详细过程)

一、基础环境 听说BIOS模式的传统MBR模式和新式UEFI模式,会对安装双系统产生影响。Windows11应该都是UEFI吧,可以按win+r输入msinfo32回车确认查看BIOS模式,我的电脑是UEFI+双硬盘 Ubuntu安装准备 1、 官网下载Ubuntu 20.04.3 LTS镜像iso文件:https://ubuntu.com/download/desktop 2、 下载官网推荐的U盘启动制作工具rufus: https://rufus.ie/ 3、制作启动u盘 插入U盘, 运行 rufu

学习随笔 9万+

redis06_ redis的订阅发布模式(redis做MQ中间件)、持久化(rdb,aof)、事务

redis的订阅发布模式(redis做MQ中间件)、持久化(rdb,aof)、事务

qq_59727955的博客 1019

Python实战:逐笔高频因子构建与回测全流程解析

本文详细解析了使用Python构建与回测逐笔高频因子的全流程。从逐笔数据的价值与清洗入手,通过实战代码演示了‘大买成交金额占比’因子的计算逻辑,并重点阐述了因子正交化处理的重要性以剔除风格影响。最后,提供了一个经典的分位数回测框架来验证因子有效性,并分享了数据质量、计算效率与过拟合等核心避坑指南。

grass的博客 391

redis06 redis事务

redis事务认识 Mutil、Exec、discard 事务的错误处理 事务冲突的问题 redis事务总结

2301_76354366的博客 971

遥感图像处理实战:DOTA数据集旋转框转YOLO格式全流程解析(附代码)

本文详细解析了将DOTA遥感数据集的旋转框标注转换为YOLO格式的全流程。针对遥感图像中物体朝向任意性的特点,文章重点阐述了将旋转框转换为外接水平框的数学原理与代码实现,并提供了批量转换脚本和可视化验证方法,帮助开发者高效处理数据,为基于YOLO的遥感目标检测项目奠定基础。

weixin_29082143的博客 398

华为/H3C/锐捷交换机配置命令对比表:一张图搞定VLAN划分与端口设置

本文详细对比了华为、H3C、锐捷三大品牌交换机在VLAN划分与端口设置中的配置命令差异,提供从基础配置到高级功能的横向对比表,帮助网络工程师快速掌握多品牌设备混用环境下的配置技巧,提升工作效率。

rust6ferris的博客 699

Redis06_Redis事务和乐观锁的实现

Redis06_事务和乐观锁的实现 Redis 事务 Redis 事务的本质:一组命令的集合! 一个事务中的所有命令都会被序列化,在事务执行过程中会按顺序执行 Redis 单条命令保证原子性,但是事务不保证原子性 Redis 事务没有隔离级别的概念 所有的命令在事务中并没有直接被执行,只有发起执行命令的时候才会执行 multi 开启事务 exec 提交执行事务 127.0.0.1:6379> multi OK 127.0.0.1:6379> set k1 v1 QUEUED 127.0.

BLU_111的博客 12万+

保姆级教程:在Ubuntu 22.04上从零安装SUMO并运行第一个交通仿真

本教程详细介绍了在Ubuntu 22.04系统上从零安装SUMO交通仿真软件并运行第一个仿真的完整流程。涵盖环境准备、PPA源安装、核心组件验证、首次仿真案例运行以及进阶配置技巧,特别针对netedit路网编辑器和地图格式转换等实用工具进行重点讲解,帮助用户快速掌握SUMO在交通仿真领域的应用。

weixin_30546189的博客 420

【周阳-Redis】【06】Redis事务

持续学习&持续更新中… 守破离 【周阳-Redis】【06】Redis事务Redis的事务是什么Redis事务命令正常执行放弃事务全体连坐冤有头债有主watch监控小结Redis事务的三阶段Redis事务的三特性参考 Redis的事务是什么 Redis 事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。 可以一次执行多个命令,本质是一组命令的集合。 一个事务中的所有命令都会序列化,按顺序地串行化执行而不.

Keep Reading Keep Writing Keep Thinking 241

使用C/C++复制图像

要使用上述代码,需要将输入图像和输出图像的文件名替换为实际的图像文件名。当程序执行完毕后,将会在当前目录下生成一个名为"output.jpg"的图像文件,其中包含与输入图像完全相同的图像数据。要使用上述代码,需要将输入图像和输出图像的文件名替换为实际的图像文件名。当程序执行完毕后,将会在当前目录下生成一个名为"output.jpg"的图像文件,其中包含与输入图像完全相同的图像数据。函数将输出图像保存到文件中。在这个示例中,我们假设输入图像是一个常见的JPEG图像,文件名为"input.jpg"。

CyberWarpX的博客 728

Redis_06_Redis事务

Redis事务

毛毛的专栏 509

【推荐100个unity插件】性能极高的逼真爆炸、火焰和烟雾效果——UNI VFX

这是一篇关于Unity中高性能GPU粒子特效插件UNI VFX的使用指南。文章介绍了该插件提供逼真的爆炸、火焰和烟雾效果,支持URP和HDRP渲染管线。主要内容包括:插件安装方法(需预先安装Visual Effect Graph和Shader Graph包)、事件系统使用方法(如create/loop/stop等事件控制)、特效分类(自动结束型和持续型特效)、检视面板配置技巧以及性能优化建议(特别提醒灯光特效对性能的影响较大)。文末还推荐了多个Unity开发相关的专栏内容。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1487

「Redis」06 事务与锁机制

1. Redis的事务定义 Redis 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 注意:Redis 的事务与 MySQL 的事务不同 Redis 事务的主要作用就是串联多个命令防止别的命令插队。 2. 事务基本命令 (Multi、Exec、Discard) 从输入 Multi 命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入 Exec 后,Redis 会将之前的命令队列中的命令依次执行。 组队的过程中可以

How many ten years in the life time? 320

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【Redis】事务

Redis事务

qq_55119554的博客 1122

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Day——06 Redis 事务、锁机制 事务的秒杀案例

Redis 锁 事务

qq_40388903的博客 186

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Redis的事务是什么样子的?Redis的事务和MySql的事务的区别在哪?watch命令的作用是什么?

有这样一种场景,客户端1开启了事务,并且设置了 key,但是,在执行事务之前,客户端2 修改了key,此时,按照常理来讲,key 应该是 222,但是,因为在客户端1中,只是将命令放到了队列中,并没有实际的去执行,只有在输入 exec 命令之后,才会执行,所以,最终的 key 的 value 是 111。从下图可以看到,在开启事务后,set 命令并没有生效,只是返回了一个 queued,这就说明,当前的命令,只是被放入了事务队列中,并没有生效,此时,如果通过另一个客户端获取的话是获取不到的。

Shine0115的博客 1013

Redis 05 06 07章——事务、管道、发布订阅

Redis 05 06 07章——事务、管道、发布订阅

weixin_74019079的博客 1169

2023-06-09:什么是Redis事务?原理是什么?

2023-06-09:什么是Redis事务?原理是什么?答案2023-06-09:Redis中的事务是以一组命令的形式出现的,这些命令被认为是最小的执行单位。事务可以保证在一个单独独立的隔离操作中执行所有命令,而且所有命令都会按照指定的顺序经过序列化后被执行。在服务端执行事务的过程中,不受其他客户端发送给Redis的命令请求的干扰影响。Redis 事务的注意点有哪些?Redis事务的使用需要注意以下几点:1.Redis 事务不支持回滚,不能像 MySQL 的事务那样可以选择性地输出。

福大大架构师每日一题 1412

【06-Redis事务】

MULTI 、 EXEC 、 DISCARD 和 WATCH 是 Redis 事务相关的命令。事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。 EXEC 命令负责触发并执行事务中的所有命令

https://github.com/Wang-Jun-Chao 887

Redis 事务的精髓:原子性与隔离性

Redis 事务是一种将多个命令打包成一个单独执行单元的机制,确保了命令的**原子性**和**隔离性**。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 8320

Redis-事务

开启: 以MULTI开始一个事务入队: 将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面执行:由 EXEC命令触发事务。

weixin_62485485的博客 999

Redis事务,管道,发布订阅

可以一次性执行多个命令,本质是一组命令的集合。一个事务中所有的命令都会序列化,按照顺序的串行化执行而不会被其他的命令插入,不许加塞。用于在一个队列,一次性,顺序性,排他性的执行一系列命令。

2303_79647930的博客 1054

Redis事务

Redis事务

qq_55846232的博客 902

【Redis 进阶】事务

从输入命令的时间看,是客户端 1 先执行的 set key 222,客户端 2 后执行的 set key 333。但是从实际的执行时间来看,是客户端 2 先执行的,客户端 1 后执行的。由于客户端 1 得是 exec 执行了,才会真正执行 set key 222,所以这个操作实际上更晚执行,最终值就是 222.这个时候其实就容易引起歧义。因此,即使不保证严格的隔离性,至少也要告诉用户,当前的操作可能存在风险。watch 命令就是用来解决上述这个问题的,watch在该客户端上监控一组具体的 key。

Elena's Blog 1068

Redis-06-事务和监控

Redis-06-事务和监控

weixin_46147113的博客 336
上一篇: 中间件_Redis_05_Redis的持久化
下一篇: 计算机基础_程序是怎样跑起来的_01_CPU是什么?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窝在角落里学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值