周晓楠

导航

 

1. 分布式锁本质是占一个坑,当别的进程也要来占坑时发现已经被占,就会放弃或者稍后重试

2. 占坑一般使用 setnx(set if not exists)指令,只允许一个客户端占坑

3. 先来先占,用完了在调用del指令释放坑


> setnx lock:codehole true
.... do something critical ....
> del lock:codehole

4. 但是这样有一个问题,如果逻辑执行到中间出现异常,可能导致del指令没有被调用,这样就会陷入死锁,锁永远无法释放

5. 为了解决死锁问题,我们拿到锁时可以加上一个expire过期时间,这样即使出现异常,当到达过期时间也会自动释放锁


> setnx lock:codehole true
> expire lock:codehole 5
.... do something critical ....
> del lock:codehole

6. 这样又有一个问题,setnx和expire是两条指令而不是原子指令,如果两条指令之间进程挂掉依然会出现死锁

7. 为了治理上面乱象,在redis 2.8中加入了set指令的扩展参数,使setnx和expire指令可以一起执行


> set lock:codehole true ex 5 nx
''' do something '''
> del lock:codehole 
posted on 2020-10-27 16:03  周晓楠  阅读(119)  评论(0编辑  收藏  举报