基于分布式系统,Java提供的内置锁(synchronized和AQS Lock)无法满足在分布式环境下保证线程的原子性一致性持久性
使用Redis Spring数据结构基于原子性的设计可以实现其分布式锁
其思路为:
第一步
通过RedisTemplate接口向Redis中新增我们的锁数据(参数:锁名,线程ID,超时自动过期时间,单位)
第二步
判断该线程是否是新增锁数据的线程(判断redis中是否存有锁名的数据),即判断该线程是否拿到锁,如果是就执行业务逻辑,如果没有拿到锁那么处于等待状态,直到该锁被释放
第三步
程序执行完成,执行释放锁的代码(delete),允许其他线程争抢拿锁执行
说明:
应保证添加锁数据时原子性
应保证是对应的线程释放对应的锁(加入线程ID参数的原因,防止出现锁失效)
锁的自动失效时间不易过长也不易过短
简单代码如下:
问题:
无法保证线程在锁失效时间前执行完毕 会出现bug
解决方案:锁续命
比较成熟的锁框架推荐
redisson
基于redis 原子性 即lua脚本实现