基于Redis实现分布式锁
获取锁的Redis命令
set resource_name my_random_value NX PX 30000
resource_name: 资源名称,可根据不同业务区分不同的锁
my_random_value: 随机值,每个线程的随机值都不同,用于释放锁时的校验
NX: key不存在时设置成功,key存在则设置不成功
PX: 自动失效时间,出现异常情况,锁可以过期失效
30000: 有效时间
原理:
利用NX的原子性,多个线程并发时,只有一个线程可以设置成功
设置成功即获得锁,可以执行后续的业务处理
如果出现异常,过了锁的有效期,锁自动释放
释放锁采用Redis的delete命令
释放锁时校验之前设置的随机数,相同才能释放锁
释放锁的LUA脚本:
if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end