随着企业软件开发中微服务化不断发展,应用分布式部署如今已是家常便饭,而分布式锁更是个老生常谈的技术话题。笔者发现,目前网上关于分布式锁的文章都不够全面。真实生产环境实现分布式锁是有很多重要的细节点。笔者,参考了一系列文章以及公司本身的生产实践,阐述了分布式锁的实际应用中的要点(包含理论分析与代码实现)。
1、什么是分布式锁?为什么要用分布式锁?
服务分布式部署之后,多个实例(Java进程)争抢共享资源(往往这种情况都是非幂等的操作),需要加锁控制,保证同一时间只有一个客户端对共享资源进行操作,保证数据一致。例如,商品秒杀时,没有正确对商品数量加锁进行并发控制的话,可能出现商品超卖。
实现分布式锁需要同时满足四个条件:
- 互斥,同一时刻只能有一个客户端获取到锁。
- 不会发生死锁,一个客户端异常导致没有释放锁,其他客户端也要能获取到锁。
- 解铃还须系铃人,加锁解锁必须是同一客户端,不能误解了别的客户端加的锁。
- 具有容错性,大多数redis节点正常运行,客户端就能获取锁和解锁。