1.生成锁(即是redis的key)时,需要给锁设置一个过期时间,防止出现异常,锁一致存在。
2.删除锁时,需要注意两点,a:当前线程加的锁当前删除, b:保证redis的删除操作需要具有原子性
延伸问题:上述第一个,如何保证过期时间一定大于当前线程在该业务方法中的操作时间,Redis锁的过期时间小于业务的执行时间该如何续期?
@Autowired
private StringRedisTemplate redisTemplate;
//redis锁名
String lockKey = "LOL";
public void test() {
//锁的值
String value = UUID.randomUUID().toString()+Thread.currentThread().getName();
try {
Boolean flag = redisTemplate.opsForValue().setIfAbsent(lockKey, value, 10L, TimeUnit.SECONDS);
if (flag){
String num = redisTemplate.opsForValue().get("goods:001");
int num1 = Integer.parseInt(num);
if (num1>0){
num1--;
redisTemplate.opsForValue().set("goods:001",String.valueOf(num1));
}else {
throw new RuntimeException("没有了");
}
}
} catch (NumberFormatException e) {
e.printStackTrace();
} finally {
//1.自己加锁自己删 2.保证redis删除key具有原子性
while (true){
redisTemplate.watch(lockKey);
if (redisTemplate.opsForValue().get(lockKey).equals(value)){
redisTemplate.setEnableTransactionSupport(true);
redisTemplate.multi();
redisTemplate.delete(lockKey);
List<Object> exec = redisTemplate.exec();
if (exec == null){
continue;
}
}
redisTemplate.unwatch();
break;
}
}
}
版权声明:本文为snow_5原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。