zoukankan      html  css  js  c++  java
  • redis 重试锁

    @Value("${get.lock.max.time}")
    private Integer getLockMax;

    @Value("${get.lock.sleep}")
    private Long getLockSleep;

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    /**
    * @desc : 加锁
    * lockKey:加锁的key retryTimes:重试次数 expireTime:加锁有效期(单位:毫秒)
    * @create: 2021/4/1 14:54:00
    **/
    @Override
    public void addLock(String lockKey, Integer retryTimes,Long expireTime) {
    if (retryTimes.equals(getLockMax)) {
    log.warn("达到最大重试次数:{},获取锁失败", getLockMax);
    throw new BusinessException(CloudWalkErrorCodeEnum.PET_GET_LOCK_ERROR);
    }
    log.info("开始加锁:{},retryTime:{}", lockKey, retryTimes);
    Long increment = this.increment(lockKey, 1L, expireTime);
    if (increment > 1) {
    try {
    Thread.sleep(getLockSleep);
    } catch (InterruptedException e) {
    log.error("休眠异常:{}", e);
    Thread.currentThread().interrupt();
    }
    retryTimes++;
    log.info("加锁失败", retryTimes);
    addLock(lockKey, retryTimes,expireTime);
    } else {
    log.info("加锁成功");
    }

    }


    /**
    * @desc : 释放锁
    * @create: 2021/4/1 14:54:00
    **/
    @Override
    public void unLock(String lockKey) {
    log.info("释放锁:{}", lockKey);
    this.delete(lockKey);
    log.info("释放锁成功");
    }


    @Override
    public Long increment(String key, long delta, Long expireTime) {
    log.info("increment key: {}", key);
    Long current = redisTemplate.opsForValue().increment(key, delta);
    if(expireTime != null) {
    expire(key, expireTime);
    }
    return current;
    }

    @Override
    public void delete(String key) {
    log.info("delete key: {}", key);
    redisTemplate.delete(key);
    }
  • 相关阅读:
    xpath元素定位 绝对路径改成相对路径
    jmeter(十一)csv读取中文乱码问题
    jmeter(十)上传文件遇到的奇葩问题
    jmeter(八)Synchronizing Timer的使用
    jmeter.properties配置文件修改
    jmter命令行-生成压力测试报告
    python(二)字符串、列表、数组、元组、字典
    python配置虚拟环境和包
    验证码测试
    性能测试面试题
  • 原文地址:https://www.cnblogs.com/maohuidong/p/14606529.html
Copyright © 2011-2022 走看看