开发者学堂课程【Redis 入门到精通(进阶篇):事务-死锁解决方案】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/765/detail/13436
事务-死锁解决方案
内容介绍
一、分布式锁的解决方案
二、分布式锁改良
三、分布式锁时间限定的注意事项
一、分布式锁的解决方案
1、业务场景
依赖分布式锁的机制,某个用户操作时对应客户端宕机,且此时已经获取到锁。如何解决?
首先分析原因,制定解决方案,但其存在风险点,若想平稳发展需录入系统等。
2、业务分析
(1)由于锁操作由用户控制加锁解锁,必定会存在加锁后未解锁的风险
(2)需要解锁操作不能仅依赖用户控制,系统级别要给出相应的保底处理方案
二、基于特定条件的事务执行—分布式锁改良
解决方案
使用 expire 为锁 key 添加时间限定,到时不释放,放弃锁。
1、expire lock-key second
2、pexpire lock-key milliseconds
举例:首先清空所有,设定数据 set name 123,获取执行权限sexnx lock-name 锁住,设入时限expire lock-name 20即可。若20秒用完后get name可释放掉del lock name删除即可。若没删除需要setnx lock-name,另一客户端需要获取执行,一直锁不住,锁时需加上expirelock-name 20秒的时限设入即可,以上即是通过锁的形式来控制操作。
三、分布式锁时间限定的注意事项
由于操作通常都是微妙或毫秒级,因此该锁定时间不宜设置过长,通常是根据具体的业务和数据获取的平均值来决定。
例如:
1、持有锁的操作最长执行时间127ms,最短执行时间7ms。
2、锁时间设定推荐:最大耗时×120%+平均网络延迟×110%。
3、如果业务最大耗时<<网络平均延迟,通常为2个数量级,取其中单个耗时较长即可。