吊打面试官之幂等性问题
1、什么是幂等性问题?
我认为就是在同一个操作中不论执行多少次请求产生的效果和返回的效果都是一样的。
场景: 只要更新数据是依赖读取的数据作为基础条件的,当遇到高并发的时候,就可能会出现幂等性问题;(卖票,充值等场景)
解决方案: 在该操作上加锁,只允许一个人操作成功。
2、有哪些幂等性问题解决方案?
1. 悲观锁
2. 乐观锁
3. 分布式锁(推荐)
3、为什么选择分布式锁解决幂等性问题方案?
3.1、悲观锁
解释: 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。
优点:
1、实现简单
缺点:
1、数据锁定时间可能会很长,影响用户体验和系统吞吐量
3.2、乐观锁
解释: 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
优点:
1、运用广泛
2、不影响系统性能
缺点:
1、对代码具有入侵性
乐观锁链接:吊打面试官之乐观锁
3.3、分布式锁
解释: 就是进程A和进程B发送短信前先去注册一个锁,假设进程A抢到了锁,进程B就等待结果,如果发送成功了,那么B就放弃此次任务,等待下一个小时
优点:
1、基于分布式系统
2、使用广泛
3、扩展性高
缺点:
1、实现复杂
乐观锁链接:吊打面试官之分布式锁
4、我是如何使用分布式锁解决幂等性问题?
(1)获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID(或者业务Id),通过此在释放锁的时候进行判断。
(2)获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。
(3)释放锁的时候,通过UUID(或者业务Id)判断是不是该锁,若是该锁,则执行delete进行锁释放。
代码下载地址: 源码地址
5、往期佳文
5.1、面试系列
······持续更新中······
5.2、技术系列
1、吊打面试官之分布式会话
2、吊打面试官之分布式锁
3、吊打面试官之乐观锁
······持续更新中······