当前位置: 首页>后端>正文

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

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

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

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

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

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

简单代码如下:

基于redis简单的分布式锁实现思路,第1张

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

比较成熟的锁框架推荐
redisson

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

基于redis简单的分布式锁实现思路,第2张

https://www.xamrdz.com/backend/3dr1930928.html

相关文章: