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
注意:
明后天高考,祝莘莘学子考上理想的大学, 让知识改变命运。加油!!!