基于redis简单的分布式锁实现思路

基于分布式系统,Java提供的内置锁(synchronized和AQS Lock)无法满足在分布式环境下保证线程的原子性一致性持久性
使用Redis Spring数据结构基于原子性的设计可以实现其分布式锁
其思路为:

第一步
通过RedisTemplate接口向Redis中新增我们的锁数据(参数:锁名,线程ID,超时自动过期时间,单位)

第二步
判断该线程是否是新增锁数据的线程(判断redis中是否存有锁名的数据),即判断该线程是否拿到锁,如果是就执行业务逻辑,如果没有拿到锁那么处于等待状态,直到该锁被释放

第三步
程序执行完成,执行释放锁的代码(delete),允许其他线程争抢拿锁执行

说明:
应保证添加锁数据时原子性
应保证是对应的线程释放对应的锁(加入线程ID参数的原因,防止出现锁失效)
锁的自动失效时间不易过长也不易过短

简单代码如下:

问题:
无法保证线程在锁失效时间前执行完毕 会出现bug
解决方案:锁续命

比较成熟的锁框架推荐
redisson

基于redis 原子性 即lua脚本实现

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容