问题场景:
由于我们项目是多台共同部署同一个项目的,此时传统的synchronize锁等只能锁住当前虚拟机!在操作统一资源时候并不能解决并发问题,此时需要一个共有资源作为锁!
分布式锁实现方式:
1:数据库锁(无锁失效机制)
2:redis锁
3:zookeeper锁
我司使用的是redis锁,本文是自己对redis的理解!
1.获取锁,基于redis的sennx指令,redis高版本已实现原子性。共享资源作为key,随机数作为value(目的是只能由当前线程删掉这把锁,防止其他线程误删)如果未获取到进行重试,线程睡眠一段时间继续抢锁,锁定成功返回RedisLock(key,value)对象,锁定失败返回null
2.释放锁,基于lua脚本实现,必须value匹配才能释放锁。如果当前服务挂掉,redis有过期时间自动释放
问题:
1.此方法在获取失败时会自动重试指定的次数,多次等待会阻塞当前线程(可以修改为不重试的方法)
2.主从复制主服务器挂掉问题
官方给出的解决方案是redislock算法