Redis分布式锁,你用对了吗?
具备哪些特性的分布式锁才是一个优秀的分布式锁?牛牛认为要从如下几方面来看:
互斥性:锁的目的是获取资源的使用权,所以只让一个竞争者持有锁,这一点要尽可能保证; 安全性:避免死锁情况发生。当一个竞争者在持有锁期间内,由于意外崩溃而导致未能主动解锁,其持有的锁也能够被正常释放,并保证后续其它竞争者也能加锁; 对称性:同一个锁,加锁和解锁必须是同一个竞争者。不能把其他竞争者持有的锁给释放了,这又称为锁的可重入性。 可靠性:需要有一定程度的异常处理能力、容灾能力。
分布式锁,一般会依托第三方组件来实现,而利用Redis实现则是工作中应用最多的一种。
今天,就让我们从最基础的步骤开始,依照分布式锁的特性,层层递进,步步完善,将它优化到最优,让大家完整地了解如何用Redis来实现一个分布式锁。
最简化版本
支持过期时间
能够支持过期时间,目前这个锁基本上是能用了。
加上owner
引入Lua
容灾考虑
主从容灾
多机部署
可靠性深究
我们围绕互斥性、安全性、对称性层层递进,实现了一个Redis分布式锁,这样的架构在大多数业务场景都是完全够用的。
同时,我们也针对可靠性,探讨了主从容灾、Red Lock等解决方案,并分析了NPC异常场景,了解到分布式锁在什么情况会失去作用,这些知识在实际的业务中都非常实用,能够在实际开发中做出正确的决策。
牛牛建议对分布式锁不要强依赖,没有绝对可靠的分布式锁,分布式锁需要与业务的联动配合更加切实可行,脱离了业务,就是空中楼阁,不着实地。
评论