首先分布式锁的解决方案:使用Redis的setnx和zookeeper 的注册中心。
以下针对redis的进行分析
单机版redis锁
只使用一台redis机器进行锁的获取和取消,可能会出现单机宕机的话就会出现问题,使用分布式锁功能的业务就无法使用。
主从(哨兵模式)分布redis锁
使用主从模式,加锁和解锁都通过主redis进行操作,然后同步到其他的从redis中,当主机宕机的时候,使用从redis顶上,但是这种主从分布的方法也存在问题,如当主redis把锁分给了一个业务,主redis掉线了,但是还没有把当前锁的信息同步给从节点,从节点升级为主master之后,其他业务也去申请锁,这时候原来的从节点也就是现在的主节点看到当前锁没有被占用就会去分配给其他业务,就会造成一个锁多个业务使用,数据库就会出问题。
redis集群分布式锁(红锁RedLock)
红锁是在集群模式下,对于所有的redis都是作为主redis,没有从redis,红锁的原理就是从集群中去获取redis锁,如果集群中大于等于n/2+1个redis实例返回了锁,就代表获取锁成功,如果没有达到指定的数量,就向所有redis发送删除锁的指令,因为有的获取成功了要进行删除。