Redis实现分布式锁
Redis实现分布式锁
redis做分布式锁存在的问题
加锁、解锁、判断和删除使用的是不同的命令,单独的命令是原子性的。
分布式锁lua脚本+redis原生代码
- redis做分布式锁的核心是要保证多个指令原子性,加锁使用setnx setex可以保证原子性,但是解锁、判断和删除无法保证原子性,因为加锁、解锁、判断和删除使用的都是不同的命令。
- 多个命令的原子性:采用lua脚本+redis,由于判断和删除是lua脚本执行,所以要么全成功,要么全失败。
核心代码
//获取lock的值和传递的值一样,调用删除操作返回1,否则返回0
String script = "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end";
//Arrays.asList(lockKey)是key列表,uuid是参数
Integer result = redisTemplate.execute(new DefaultRedisScript<>(script, Integer.class), Arrays.asList(lockKey), uuid);