redis分布式锁

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版权协议,转载请附上原文出处链接和本声明。