57

Redis分布式锁解析

 5 years ago
source link: https://blog.csdn.net/zhongguoren666/article/details/88752099?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一、分布式锁方案比较

N7BNRzZ.png!web

二、关于Redis分布式锁基础知识

7RjEJzb.png!web

三、Redis 加解分布锁的正确姿势

IJFZvyv.png!web

四、Redis 分布式加锁的主要流程

  1. 产生随机数,可用 UUID ,存储起来,一般存储在 ThreadLocal 中,以便解锁用;
  2. 调用Redis 的 SETNX 命令将随机数当作 value 存入 ,key为taskId,同时 设置过期时间 。(实际项目中过期时间的多少主要是取决任务估算的执行时间,一般为估算执行时间*2,如该任务的估算时间是2m,则过期就要设置4m);
  3. 如果返回ok,说明加锁成功,否则失败;

五、Redis分布式解锁的主要流程

  1. 调用 lua 脚本 进行解锁,保证原子性;
  2. Lua脚本实现: 判断 key 的值和我们存入的 UUID 随机数是不是相等 ,是的话,则调用 DEL 指令 进行删除操作;

六、加锁代码

1. 实现类继承 LOCK 类部分代码

NBVfUzz.png!web

2. 阻塞式加锁代码

qMbieqz.png!web

3. 非阻塞式加锁代码

FnQbqe3.png!web

七、用 ThreadLocal 存储加锁产生的随机值

uQ7FneJ.png!web

八、解锁代码

1. 解锁代码截图

VvYnI3i.png!web

2. Unlock.lua 脚本代码

zeM3InB.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK