螺竹编程
发布于 2024-05-26 / 9 阅读
0

分布式系统/分布式锁: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);