一 、 使用redis 实现分布式锁
使用步骤
1.setnx(lockkey,1) 如果返回 0 说明失败,返回1 说明成功。
2. 使用expire() 设置超时时间,避免死锁
3.执行完代码以后使用 delete 命令删除 key
缺点: 当第一步执行成功以后,这时候如果机器宕机,这样的话 会造成死锁。
第二种方式:
1.setnx(lockkey,当前时间+过期时间) 1 设置成功 0 失败
2.get(lockkey) 获取时间 oldExpireTime 和当前的系统时间进行比较,小于当前时间的话说明锁已经超时,别人可以请求,转向 3
3.计算newExpireTime =当前时间 + 过期时间 使用getset(lockkey,newExpireTime)会返回当前的 lokkey的值 currentExpireTime
4.判断currentExpireTime与oldExpireTime 是否相等,相等的话说明这期间没有别的线程进行操作,获取锁成功,否则失败
5.在获取到锁治好后,当前的线程可以开始进行自己的业务处理,处理完毕以后小于超时时间,进行删除,大于超时时间不需要进行任何操作。