目录
一、先上图,加锁场景和解锁场景
简单代码
二、源码分析
1、加锁逻辑分析
redisson使用lua脚本操作redis来进行加锁,因为lua脚本中的代码逻辑在redis中执行能够保证原子性。
这个lua脚本就是加锁的核心代码,分析一下内容。
KEYS[1]就是要加锁的key,ARGV[1]是加锁超时时间,ARGV[2]是加锁线程唯一标识。
首先判断key是否存在;
若不存在则代表无锁状态,接下来设置锁信息,field为线程唯一标识,value是加锁次数,然后设置key的超时时间,最后返回nil,意味着获得了锁。
若key存在,再判断线程唯一标识是否一致,
如果一致则获得锁,加锁次数+1,重置超时时间。
若不一致则返回key的过期时间。
除了核心lua脚本外,redisson还提供自旋获取锁的能力,在获取锁失败后会进入到自旋代码块