redisson实现分布式锁

redisson分布式锁解决的问题

1.多个服务之间同一时间只能有一个服务执行业务方法
2.锁与线程的通讯,例如执行业务的时间比锁设置的失效时间还要长,redis就要判断是否需要延长锁失效时间

导入jar

这里使用maven导入

<!--        引入redisson-->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.13.2</version>
        </dependency>

创建锁

这里锁有两种常规锁与公平锁

1.常规锁

		//创建锁
       	RLock lock = redissonClient.getLock(lockName);

2.公平锁

        //创建公平锁 根据请求的时间去分配下一个获取锁的对象
        RLock lock = redissonClient.getFairLock(lockName);

加锁

void lock();

		//加锁1 此方法没有返回值,加锁成功就会继续执行下面的代码,
		//如果这个锁已经存在,他就会一直阻塞,直到锁的时间失效(默认30秒),
		//这个方法是保证一定能抢到锁的
        lock.lock();

void lock(long var1, TimeUnit var3);

		//加锁2 设置锁的时间和单位
        lock.lock(5, TimeUnit.SECONDS);

boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

			//加锁3 (第一个参数是等待锁的最长时间)表示尝试去加锁,如果加锁成功就返回true执行接下来的代码,但是redis如果已经有了这个锁他会进行等待,还拿不到锁就会返回false,执行false的代码块
            //为了将实现waitTime,使用了redis的订阅发布功能。也就是没有抢到锁的线程订阅消息,直至waitTime过期返回false或者被通知新一轮的开始抢占,如果他抢占到锁,锁的过期时间也是30秒,
            boolean isLock = lock.tryLock(5, TimeUnit.SECONDS);
            if (!isLock){
                log.info("加锁失败");
                return;
            }

boolean tryLock(long var1, long var3, TimeUnit var5) throws InterruptedException;

			//加锁4 (第一个参数为等待锁的最长时间)(第二个参数是表示锁的失效时间)
            boolean isLock = lock.tryLock(5,5, TimeUnit.SECONDS);
            if (!isLock){
                log.info("加锁失败");
                return;
            }	

删除锁

void unlock();

//此方法必须放在finally里面,防止业务代码报错而不释放锁
lock.unlock();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值