如何实现分布式锁,是面试老生常谈的一个问,但是怎么回答的才算好呢,个人认为可以将多种方案一一列举,然后说出其优缺点,以及使用场景,这样回答会比较好。
1.使用Redis如何实现分布式锁方案一
- 使用 redis set(k,v ,nx,px) 命令 ,一个命令,设置锁的同时设置失效时间。使用一个命令保证原子性。
- key 是自己定义的key, value 可以用当前线程的ID或者是 ,建议调用方自定义一个业务标识,在加锁的方法开始可以使用UUID
- 解锁放在 finally 中 , 由于 redis 没有提供合适的解锁命令 ,这里不能使用 删除,因为 finally 块都能执行,可能出现,自己加的锁被别人删除了的情况,需要使用 lru表达式 ,根据key查到数据,若 value 仍然是一开始传入的标识 (UUID) 则表示是同一个人。再删除key , 使用 lru表达式保证原子性
总结:方案一不支持 锁等待,以及锁续期,
要加其它线程取不到锁等待的话,可以在加锁处设置一个 循环 for(; 适当休眠,后再次抢锁。
方案二
- 使用** redission客户端 锁续期-看门狗机制**
//获取一把锁,只要锁的名字一样就是同一把锁 RLock lock = redisson.getLock(lockKey); //1.加锁(自动续期) - 默认失效时间是30秒,启动一个Timeout定时-刷新-每隔10秒判断未执行完-则继续续期30秒 lock.lock(); //2.若设置自定义超时时间则不会续期 lock.lock(10, TimeUnit.SECONDS) //10秒以后自动解锁,自动解锁时间一定要大于业务时间2.优缺点**
- 优点:实现相对简单,性能高
- 在集群状态下不保证唯一获得性。(主从结构中,从还未复制过去,主挂了,从升级为主)


![[ Redis06篇] 分布式锁实现的话术表达 [ Redis06篇] 分布式锁实现的话术表达](http://www.mshxw.com/aiimages/31/603460.png)
