Redis中的事物和锁

卑微小吴励志写博客第28天。

事务简介

Redis在执行指令过程中,多条连续的指令被打断,干扰,插对。

例如:
客户端1插入一条数据,准备查的时候,客户端2插入同样key的数据,导致客户端1没能查到想要的结果。在这里插入图片描述
redis的事物就是一个命令执行的队列,将一系列命令包装成一个整体(一个队列)。当执行时,一次性按照添加顺序执行,中间不会被干扰或者被打断。

一个队列中一次性,顺序性,排他性的执行一系列指令。

事务的基本操作

开启事务

  • mutil

作用

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

执行事务

  • exec

作用

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

注意:当开启mutil后,命令加入队列是没有立即执行的,只有执行exec命令时才开始执行。

事务定义错了或者中间写错了怎么办?

取消事务

  • discard

作用

  • 终止当前事务的定义,发生在mutil之后,exec之前。
事务的工作流程

在这里插入图片描述

事务的注意事项

在这里插入图片描述

注意:如果是语法没有错误,命令执行出现错误,则已经执行的命令是没法进行回滚的,需要程序员在代码中实现回滚。

业务场景:
比如天猫双十一,搞特卖,商品库存不足了,4个业务员去补货,但是补货有一系列操作,如何做到不重复操作。

解决方案:

  • 对key添加监控锁,在执行exec前,如果key发生了变化,终止事务执行。
    watch key1 [key2…]
  • 取消对所有key的监控
    unwatch
基于特定条件的事物执行—分布式锁

使用setnx设置一个公共锁
setnx lock-key value
利用setnx的返回值特征,有值则返回失败,无值则返回成功

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

操作完成后,通过del操作释放锁。

应用场景:redis应用基于分布式锁对应的场景控制。

忘了释放锁怎么办?

如果一个客户端拿到锁了,在执行操作的时候宕机了,没有释放锁,怎么办?

  • 需要解锁操作不仅仅只能是用户控制,系统级别要给出对应的保底处理方案。

解决方案

  • 使用expire为锁key添加时间限定,到时不释放,放弃锁。

expire lock-key second
peexpire lock-key millsecond

注意:
在这里插入图片描述

明后天高考,祝莘莘学子考上理想的大学, 让知识改变命运。加油!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值