Redis 事务机制实现过程及原理,以及使用事务机制防止库存超卖
一、Redis 事务实现的过程和原理
第一步:观察数据
客户端在修改数据之前,先使用watch命令观察要修改的数据,这一步相当于记下了数据的版本号
第二步:开启事务
使用 multi 命令开启事务。
开启事务后,所有命令都不会立即发送给Redis,而是先缓存到客户端本地,不会真正执行,直到执行exec命令提交事务的时候,客户端才会一次性把这些命令发送到Redis去执行。
第三步:Redis执行命令
客户端使用exec提交事务,Redis接收到客户端exec的命令后,会先比较数据的版本号,如果版本号一致,则会执行所有客户端提交过来的命令。
如果当前的版本号和被watch时的版本号不一致,则客户端这次提交的所有事务内的命令都不会被执行,相当于该事务执行失败。
二、实际操作
概括过程:使用watch监视数据,然后开启事务,做业务处理,提交命令。
注:什么情况下,会出现版本号不一致的情况?
比如客户端A开启事务,但还没有执行exec提交,这时客户端A对Redis的命令都缓存在了客户端A上,还没有批量提交到Redis执行命令,这时客户端B对该数据进行了写操作,那么这条数据的版本号也就变了,这时,客户端A执行exec命令,就会出现版本号不一致,导致客户端A该事务下的所有命令都执行失败的问题。
三、PHP 伪代码,实现防止商品秒杀超卖
四、说明
Redis通过watch及multi实现了防止超卖的问题,其本质是分为两部分:
第一部分是watch,第二部分是从multi到exec的所有命令。
当客户端watch命令,Redis就开始监视数据,获取数据当前版本号
当客户端exec命令,Redis先比对数据当前版本号和开始监视时的版本号是否一致,如果一致就把从multi到exec的所有命令通通执行,否则multi到exec的所有命令通通不执行。
Redis 事务机制实现过程及原理,以及使用事务机制防止库存超卖相关推荐
- 【Redis】实战篇:优惠卷秒杀 (库存超卖问题、一人一单问题)
文章目录 3.1 全局唯一ID 3.2 -Redis实现全局唯一Id 3.3 添加优惠卷 3.4 实现秒杀下单 3.5 库存超卖问题分析 3.6 乐观锁解决超卖问题 3.7 优惠券秒杀-一人一单 3. ...
- 在高并发的情况下,利用redis来处理库存超卖和遗留问题
在高并发的情况下,利用redis来处理库存超卖和遗留问题 首先现在redis中放上商品的库存数量为100间商品,在初始化一个set集合用于放秒杀成功的用户id,本用例先放进去一个id=10000的用户 ...
- 事务隔离机制原理分析以及是否可以防止订单超卖
事务的隔离机制是指: Read Uncommitted(读取未提交内容) Read Committed(读取提交内容) Repeatable Read(可重读) Serializable(可串行化) ...
- Redis解决库存超卖问题,大厂直通车
查询商品信息 (调用商品服务) 计算总价(生成订单详情) 商品服务扣库存(调用商品服务) 订单入库( 生成订单) // 原始的MySQL同步流程 // 判断此代金券是否加入抢购 SeckillVouc ...
- Spring Boot + redis解决商品秒杀库存超卖,看这篇文章就够了
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:涛哥谈篮球 来源:toutiao.com/i68366119 ...
- redis如何解决秒杀超卖java_Spring Boot + redis解决商品秒杀库存超卖,看这篇文章就够了...
作者:涛哥谈篮球 来源:toutiao.com/i6836611989607809548 问题描述 在众多抢购活动中,在有限的商品数量的限制下如何保证抢购到商品的用户数不能大于商品数量,也就是不能出现 ...
- 分布式事务开山之作——《深入理解分布式事务:原理与实战》草图曝光!!
大家好,我是冰河~~ 今天,咱们就暂时不聊[精通高并发系列]了,今天插播一下分布式事务,为啥?因为冰河联合猫大人共同创作的分布式事务领域的开山之作--<深入理解分布式事务:原理与实战>一书 ...
- Kafka中副本机制的设计和原理
Kafka中一个分区可以拥有多个副本,副本可分布于多台机器上.而在多个副本中,只会有一个Leader副本与客户端交互,也就是读写数据.其他则作为Follower副本,负责同步Leader的数据,当Le ...
- Redis解决商品秒杀与超卖
这个是实体店我们会看到的场景,100件商品,1人1件,最后200人中只有100人能买到商品,剩下100人只能空手而归.如果您开了家网店,同样你开起了秒杀的活动,可能同时会有1000人通过不同的终端访问 ...
最新文章
- 【ACM】nyoj_305_表达式求值_201308081018
- 二分法查找c语言程序_C语言的那些经典程序 第十四期
- Ubuntu 16.04将ISO镜像写入U盘
- 数据库课程设计:医院信息管理系统(pycharm+MySQL)
- 分辨率单位及换算详解
- 世界超长经典名车荟萃
- 从金山到小米,看雷军如何一步步成为“飞猪”
- ROS:launch规范及用法
- Shiro源码剖析——Subject的创建与获取(一次完整的请求执行流程)
- 图像处理基础知识——图片存储形式、色域、图片文件格式
- MSG_OOB MSG_PEEK
- 在校园网中进行无线路由器设置
- opencv的逻辑运算bitwise详解
- 洛谷P2486 染色
- Netty 通过 WebSocket 编程实现服务器和客户端全双工长连接<2021SC@SDUSC>
- newcoder 筱玛的迷阵探险(搜索 + 01字典树)题解
- (写着玩)Python仿网络游戏《炉石传说》,继上次部分代码展示
- 腾讯云安装部署Linux保姆教程
- 全志JAVA_全志a13开发总结
- 【毕业设计】毕业设计的ppt中的模版相关设计和内容实现——为了将我的毕设整得好一些