一般实现分布式锁有以下几种方式:
- 基于数据库
- 基于Redis
- 基于zookeeper
Redis实现分布式锁:
参考:分享优惠券超发的解决思路!
主要是三个关键字:setnx+expire+del
setnx用于获取锁,expire用于设置锁的过期时间,del释放锁
注意:
1、setnx+expire非原子操作,如:setnx获取到锁后,服务器宕机,过期时间未设定,其他线程获取不到锁,进入死锁;del时分为比较和删除两步,也不具有原子性,也会出现上述不安全的情况。
解决方案:使用Lua脚本(因为所有的lua脚本在Redis实例中共用同一个Lua解释器,某一个lua脚本在被执行的时候,其他lua脚本无法执行。因此对于其他lua脚本而言,一个lua脚本要么不可见,要么就已经执行完了。)
2、锁自动续期的问题,可以开一个守护线程,每隔多久给他续期一次,或者是直接将这个过期时间延长一些。
Redlock算法:
基于redis集群的分布式锁redlock_bing激凌~的博客-CSDN博客_redis分布式锁 redlock
Redlock算法解决了上述注意事项,开发人员直接调用方法获取和释放锁即可。
此外,传统的redis集群存在单点故障,redis的主从复制是异步同步,master宕机后,可能未来得及同步到从机上,此时会出现问题。Redlock算法中的redis集群由n个master构成,不存在主从复制,锁会放到每个master上,也会从每个master把锁释放。
redis的redission这个客户端提供了Redlock算法的实现。
(在redis官网推荐的三大框架就是:jedis redission lettuce)