@Autowired
private RedisTemplate redisTemplate;
public Object getRedisLock()
{
UUID uuid = UUID.randomUUID();
// 添加k,v返回true,表示获取锁成功
Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 300, TimeUnit.SECONDS);
if (lock) {
Map<String, String> result = null;
try {
// 执行业务代码
result = getResult();
} finally {
// Lua脚本,获取值对比 + 对比成功删除否则不删除返回0
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
// 删除锁
redisTemplate.execute(new DefaultRedisScript<Integer>(script, Integer.class), Arrays.asList("lock"), uuid);
}
return result;
} else {
return getRedisLock();
}
}
// 业务代码
public Map<String, String> getResult(){
return new HashMap<>();
}
基于Redis实现分布式锁
最新推荐文章于 2024-02-25 15:14:03 发布