基于Tair 的分布式锁

@Service("tairLockService")
@Slf4j
public class TairLockServiceImpl implements TairLockService {

    @Resource
    private MosTairLock mosTairLock;

    @Override
    public Boolean tryLockWait(String key, int secondsExpire, long millisTimeout) {
        if (StringUtil.isBlank(key)) {
            return false;
        }
        TairManager tairManager = mosTairLock.getTairManager();
        if (tairManager == null) {
            return false;
        }
        long deadTime = System.currentTimeMillis() + millisTimeout;
        while (System.currentTimeMillis() <= deadTime) {
            boolean lockResult = tryLock(key, secondsExpire,tairManager);
            if (lockResult) {
                return true;
            }
            try {
                long remainTimeout = deadTime - System.currentTimeMillis();
                if (remainTimeout <= 0) {
                    return false;
                }
                Thread.sleep(remainTimeout > 300 ? 300 : remainTimeout);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return false;
    }

    @Override
    public void unLock(String key) {
        if (StringUtil.isBlank(key)) {
            return;
        }
        mosTairLock.getTairManager().invalid(TAIR_NAME_SPASE,key);
    }

    private String getLockValue() {
        try {
            InetAddress addr = InetAddress.getLocalHost();
            return addr.getHostName() + ":" + Thread.currentThread().getName();
        } catch (UnknownHostException e) {
            log.error("TairLockServiceImpl getLockValue system error" , e);
            return Thread.currentThread().getName();
        }
    }

    private boolean tryLock(String key, int secondsExpir,TairManager tairManager) {
        Result<DataEntry> result = tairManager.get(TAIR_NAME_SPASE, key);
        if (result == null) {
            return false;
        }
        if (ResultCode.DATANOTEXSITS.equals(result.getRc())) {
            ResultCode code = tairManager.put(TAIR_NAME_SPASE, key, getLockValue(), 2, secondsExpir);
            if (ResultCode.SUCCESS.equals(code))
                return true;
        } else if (result.getValue() != null && getLockValue().equals(result.getValue().getValue())) {
            return true;
        }
        return false;
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值