RedisTemplate加锁

@Autowired
   private RedisTemplate redisTemplate;

   /**
    * 加锁(自动重试)
    * 
    * @param key
    * @param lockKeyType
    * @return
    */
   public boolean tryLock(String key, String lockKeyType) {
      boolean flag = false;
      try {
         key = REDIS_LOCK_KEY_PREFIX + lockKeyType + key;
         log.info("加锁请求数据,key:{}", key);

         long lockTimeout = 500 * 161;
         long sleepTimeout = 500;

         for (int i = 1; i <= 160; i++) {
            flag = this.lockOnce(key, lockTimeout);
            if (flag) {
               log.info("{}加锁第{}次,成功", key, i);
               break;
            } else {
//             log.info("{}加锁第{}次,失败", key, i);
               Thread.sleep(sleepTimeout);
            }
         }
         if (flag) {
            log.info("{}加锁成功", key);
         } else {
            log.info("{}加锁失败", key);
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
      return flag;
   }

   /**
    * 加锁
    * @param key
    * @param lockKeyType
    * @return
    */
   public boolean lock(String key, String lockKeyType) {
      key = REDIS_LOCK_KEY_PREFIX + lockKeyType + key;
      log.info("加锁请求数据,key:{}", key);
      long lockTimeout = 1 * 1000;
      boolean flag = this.lockOnce(key, lockTimeout);
      if (flag) {
         log.info("{}加锁成功", key);
      } else {
         log.info("{}加锁失败", key);
      }
      return flag;
   }

   private boolean lockOnce(String key, long timeout) {
      String value = key + "_"+System.currentTimeMillis();
      boolean flag = redisTemplate.opsForValue().setIfAbsent(key, value,
            timeout, TimeUnit.MILLISECONDS);
      return flag;
   }

   /**
    * 解锁
    *
    * @param key
    * @param lockKeyType
    */
   public void releaseLock(String key, String lockKeyType) {
      key = REDIS_LOCK_KEY_PREFIX + lockKeyType + key;
      log.info("解锁请求数据,key:{}", key);
      try {
         redisTemplate.delete(key);
         log.info("{}解锁成功", key);
      } catch (Exception e) {
         log.error("{}解锁失败,{}", key, e);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值