redis分布式锁

redisTemplate实现


    @Autowired
    private StringRedisTemplate redisTemplate;


	/**
	 * tryLock
	 * @param lockKey 锁key
	 * @param value 锁的标识
	 * @param waitTime 等待时间
	 * @param expireTime 过期时间
	 * @param timeUnit 时间单位
	 * @return Boolean
	 */
	@SneakyThrows(InterruptedException.class)
    public Boolean tryLock(String lockKey, String value, long waitTime, long expireTime, TimeUnit timeUnit) {
        String waitKey = UUID.randomUUID().toString();
        expireSet(waitKey, waitKey, waitTime, timeUnit);
        Boolean aBoolean;
        do {
            aBoolean = lock(lockKey, value, expireTime, timeUnit);
            if (BooleanUtils.isTrue(aBoolean)) {
                break;
            }
			Thread.sleep(500);
        } while (hasKey(waitKey));

        delete(waitKey);
        return aBoolean;
    }


    public Boolean lock(String lockKey, String value, long expireTime, TimeUnit timeUnit) {
        return redisTemplate.opsForValue().setIfAbsent(lockKey, value, expireTime, timeUnit);
    }

    public Boolean unlock(String key, String value) {
        // 获取当前锁的拥有者
        String currentValue = get(key);
        Boolean result = false;
        // 判断value是否为锁的拥有者
        if (StringUtils.equals(currentValue, value)) {
            //删除锁
            result = delete(key);
        }
        return result;
    }
    
        public boolean hasKey(String key) {
        return Boolean.TRUE.equals(redisTemplate.hasKey(key));
    }
    public Boolean delete(String key) {
		return redisTemplate.opsForValue().getOperations().delete(key);
    }

    public void expireSet(String key, String value, long expireTime, TimeUnit timeUnit) {
        redisTemplate.opsForValue().set(key, value, expireTime, timeUnit);
    }
    public String get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

redisson实现

    @Autowired
    private RedissonClient redissonClient;

        RLock rLock = redissonClient.getLock("my_key");
        boolean lock = rLock.tryLock(30, 30, TimeUnit.SECONDS);
        if (lock){
            try {

                //业务

            }finally {
                rLock.unlock();
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值