1.分布式锁是什么
分布式锁是控制分布式系统或不同系统之间共同访问共享资源的一种锁实现,如果不同的系统或同一系统的不同主机之间共享了某个资源时,往往通过互斥来防止彼此干扰。
2.分布式设计目的
可以保证在分布式部署的应用集群中,同一个方法在同一操作只能被一台机器上的一个线程执行。
3.设计要求
(1)这把锁要是一把可重入锁(避免死锁)
(2)这把锁有高可用的获取锁和释放锁功能
(3)这把锁获取锁和释放锁的性能要好
为了确保分布式可用,我们至少要确保锁满足以下三个条件:
(1)互斥性,在任意时刻,只有一个客户端能持有锁。
(2)不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。
(3)加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了
4.分布式锁实现方案分析
(1)获取锁的时候,使用setnx(SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0)加锁,锁的value值为当前服务器内网IP编号拼接任务标识,在释放锁的时候进行判断,并使用expire命令或者setex为锁添加一个超时时间,超过该时间则自动释放锁,setex过期以秒为单位。
(2)释放该锁的时候,判断是不是该锁(即Value为当前服务器内网IP编号拼接任务标识),若是该锁,则执行delete进行锁释放
5.分布式锁可能出现的问题
在setnx之后setex之前出现了服务宕机,redis服务宕机导致Redis锁无法过期无法释放,其他机器无法获得分布式锁。需要手动删除key。
6.怎么实现分布式锁
(1)采用lua脚本操作分布式锁
(2)采用setnx、setex命令连用(确保原子性)的方式实现分布式锁。