redis 分布式锁 底层实现的原理

redis 分布式锁,一般使用开源的redisson

 

1.客户端1的加锁

第一个if 判断 判断键key是否存在

1判断 key是否存在 exists key == 0 如果等于0 是 key 不存在

2.如果key 不存在,设置hset key argv2 1

3.设置key的过期时间 pexpire key argv1

第二个if判断 判断锁是否是可重入

1.判断key argv2是否存在,hexist key argv2 ==1 如果等于1 是可重入锁

2. 如果是可重入锁,对 key argv2 中的值进行+1 hincrby key argv2 1

3.设置key 的过期时间 pexpire key argv1

第三个判断 如果key 已经存在,而且不是可重入锁

1.设置pttl key 计算key的剩余时间 while true 循环,不断获得锁。

2.客户端2获得锁

3.可重入锁

4.watch dog的自动延期策略,默认是30s,每10s检测一下

5.释放锁 1.每次对加锁的次数减1,如果加锁的次数==0,删除对应的键

 

lua 脚本的优势

1.不使用lua脚本的代码,需要给redis 发送多次请求,而脚本只需要一次,减少网络传输。

2.原子操作: redis 把整个lua脚本作为一个原子执行,无需担心并发,无需担心事务

3.复用: lua脚本保存在redis中,可以被其他客户端复用

 

参考:

1.https://redisson.org/

2.https://www.cnblogs.com/williamjie/p/11250679.html----- redis 分布式锁

3.https://www.cnblogs.com/barrywxx/p/8563284.html---- redis 保证lua 脚本的原子性

 

 

你可能感兴趣的:(数据库)