如何写网站建设方案书,折800网站模板,广西建设网个人查询,南冒网站建设制作推广公司1、事务概要
Redis事务是一个单独的隔离操作#xff1a;
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中#xff0c;不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用 串联多个命令#xff0c;防止别的命令插队。
事务的3个命令
MultiExe…1、事务概要
Redis事务是一个单独的隔离操作
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用 串联多个命令防止别的命令插队。
事务的3个命令
MultiExecdiscard
从输入Multi命令开始输入的命令都会一次进入命令队列中但不会执行直到输入Exec后Redis会将之前的命令队列中的命令依次执行组队过程。
组队的过程中可以通过discard命令来放弃组队。
其实这里类似于二阶事务2PC但是本质是不同的
输入Multi命令进入队列排队 类似于2PC中的事务准备阶段输入Exec命令 类似于2PC中的事务提交阶段discard命令类似于事务的回滚阶段
如图 案例1 开启事务到执行队列 案例2 开启事务到放弃组队 以上是事务正常执行的案例下面演示出问题的案例
1当在组队过程中的命令出现错误直接执行队列那么执行阶段会提示transaction discard
理解为“队伍中一人坑全队输”
如下 2当组队过程中的命令正常执行队列时其中的命令存在异常。
结果哪个命令存在错误哪个命令就不会执行并提示错误信息 总结 Redis事务其实就是把一个客户端的多个命令串联起来防止其他客户端插队。并分为命令排队阶段和执行队列阶段提供队列中的回滚操作discard当排队过程中出现错误那么队列不会执行当组队成功后执行队列时某个命令出现错误那么该命令会执行失败并提示错误信息其他正常的命令正常执行。
2、事务冲突
这里用下面案例来描述
一个淘宝账号被3个人同时登录且同一时间购买不同的商品账号只有1w的余额
甲购买8000元的商品
乙购买5000元的商品
丙购买1000元的商品
假设购买时redis是按甲、乙、丙的顺序依次执行减少余额的命令最终余额出现负数
解决方案有2种
悲观锁 悲观锁Pessimistic Lock顾名思义就是很悲观每次去拿数据的时候都认为别人会修改所有每次在拿数据的时候都会上锁这样别人想拿这个数据就会block直到它拿到锁。 传统的关系型数据库里边就会用到很多这种锁机制比如行锁、表锁等读锁、写锁等都是在做操作之前先上锁。 如下 步骤详解
甲获取到锁在甲没有释放锁之前别人没办法去操作余额当甲购买完释放锁余额-80002000锁被释放后乙才能获取锁这时乙去购买商品判断此时2000-5000为负数固不执行购买操作余额不变乙释放锁。
乐观锁 乐观锁Optimistic Lock顾名思义就是很乐观每次去拿数据的时候都认为别人不会修改所以不会上锁但是在更新的时候会判断一下再此期间别人有没有去更新这个数据可以使用版本号等机制实现。 乐观锁适用于多读的应用类型这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。
步骤详解
甲乙丙在购买商品时给数据余额添加一个版本号v1.0甲乙先进行购买都获取到了余额1w及版本号对数据进行更新前会判断当前版本号是否与拿到的版本号相同相同则对数据进行操作不同则终止命令。会更新这个版本号假设此时甲获取到余额版本为v1.0与数据的版本号相同则购买商品余额减去8000并把余额版本号更新为v1.1乙比甲稍微慢点拿到的版本号也是v1.0但是在处理数据时发现当前的版本号为v1.1与拿到的版本不一致固终止命令丙后面获取到余额版本号为v1.1处理数据时与当前版本号v1.1一致再余额-1000更新版本号为v1.2
3、watch命令 语法 watch key1 key2 key3 ... 在执行multi之前先执行watch key1 ...可以监视一个或多个key如果在事务执行之前这个或这些key被其他命令所改动那么事务将被打断返回nil空
案例