redis 锁

demo1
public ErrorCode initDemo1(@RequestParam("orderNo") String orderNo) throws IOException {
        String lockKey = KEY + orderNo;
        Boolean hasKey = null;
        try {
            //锁判断
            hasKey = redisTemplate.hasKey(lockKey);
            
            int index = 0;
            while (hasKey && index < 3) {
                log.info(">>>>>>>>>>>>>刷新,wait>>>>>>>>>>>>>");
                index++;
                Thread.sleep(1500L * index);
                hasKey = redisTemplate.hasKey(lockKey);
            }
            if (index > 0) {
                log.info(">>>>>>>>>>>>>wait index:{} hasKey: {}", index, hasKey);
            }
            
            //加锁
            redisTemplate.opsForValue().set(lockKey, "1", 5, TimeUnit.SECONDS);
            
            //业务操作-刷新es todo 业务逻辑

            //去锁
            redisTemplate.delete(lockKey);
            return ErrorCode.SUCCESS;
        } catch (Exception e) {
            //去锁
            redisTemplate.delete(lockKey);
            return ErrorCode.SYS_ERROR;
        } 
    }
    

demo2    
public ErrorCode initDemo2(@RequestParam("orderNo") String orderNo) throws IOException {
        String lockKey = KEY + orderNo;
        Boolean hasKey = null;
        try {
            hasKey = lock(lockKey, orderNo, 5);
            if(hasKey != null && hasKey) {
                //业务操作-刷新es todo 业务逻辑
            }else {
                return ErrorCode.LOCK_FAILED;
            }
            return ErrorCode.SUCCESS;
        } catch (Exception e) {
            return ErrorCode.SYS_ERROR;
        } finally{
            if(hasKey != null && hasKey) {
                redisTemplate.delete(lockKey);
            }
        }
    }
    
    
    public boolean lock(String key, String value, long releaseTime) {
        // 尝试获取锁  spring-data-redis 2.1版本以上     //implementation group: 'org.springframework.data', name: 'spring-data-redis', version: '2.1.0.RELEASE'
//         Boolean boo = redisTemplate.opsForValue().setIfAbsent(key, value, releaseTime, TimeUnit.SECONDS); //.setIfAbsent(key, value, releaseTime, TimeUnit.SECONDS);
         // 判断结果
//         return boo != null && boo;
        
        redisTemplate.setEnableTransactionSupport(true);
        redisTemplate.multi();
        redisTemplate.opsForValue().setIfAbsent(key,value);
        redisTemplate.expire(key,releaseTime, TimeUnit.SECONDS);
        List result = redisTemplate.exec(); // 这里result会返回事务内每一个操作的结果,如果setIfAbsent操作失败后,result[0]会为false。
        if(result != null && true == (Boolean)result.get(0)){
            return true;
        }else {
            return false;
        }
    }

 

上一篇:SpringBoot集成Redis


下一篇:2021-06-29