redis 锁

代码语言:javascript代码运行次数:0运行复制demo1public ErrorCode initDemo1(@RequestParam("orderNo") String orderNo) throws IO

redis 锁

代码语言:javascript代码运行次数:0运行复制
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;
        }
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2021-07-12,如有侵权请联系 cloudcommunity@tencent 删除returnstring事务nullredis

发布者:admin,转转请注明出处:http://www.yc00.com/web/1754990577a5224598.html

相关推荐

  • redis 锁

    代码语言:javascript代码运行次数:0运行复制demo1public ErrorCode initDemo1(@RequestParam("orderNo") String orderNo) throws IO

    1月前
    240

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信