redison 自动续期的 分布式锁


1 导入 maven

		  
		    org.redisson
		    redisson
		    3.11.1
		 

 2 初始化redisson 客户端(redison  支持 单机,主从,哨兵,分布式集群4 中模式)

    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://ip:端口");

        RedissonClient redisson = Redisson.create(config);

        return redisson;
    }

3 redison 可以为锁自动续租,原理就是维持了一个定时任务,给隔10 秒吧锁的过期时间设置为30 秒。如果这时候rredison 客户端退出,这个续期的定时任务被释放,锁就会过期。

		RLock  lock = redissonClient.getLock("lockName");
		
		try {
			if( lock.tryLock() ) {
				System.out.println("拿到锁了做点事");
			}
			
			
		}catch (Exception e) {
			e.printStackTrace();
		}finally {
			lock.unlock();
		}

4 redison 还提供了不续租的方法,可以指定  请求锁等待时间,和 锁过期时间的方法

5 不带参数的 是不等锁(一次获取不到直接返回),锁自动续期。

 6 redison 的 获取锁默认是非公平的(随机抢锁),可以使用getFairLock获取公平锁(按时间顺序获取锁)

RLock  lock = redissonClient.getFairLock("lockName");
		
		try {
			if( lock.tryLock() ) {
				System.out.println("拿到锁了做点事");
			}
			
			
		}catch (Exception e) {
			e.printStackTrace();
		}finally {
			lock.unlock();
		}

7 redis 也有读写锁

		RReadWriteLock  lock = redissonClient.getReadWriteLock("lockName");
		lock.readLock();
		lock.writeLock();

8 getMultiLock 吧几把锁当做一把锁。( 是获取到全部的锁才算获取到了  这把多锁 )

测试如果调用了t1锁定了 lock1 不释放,t2 获取不到锁。并且不会等待,直接返回。

	@PostMapping("t1")
    public String t1() {
		RLock  lock = redissonClient.getLock("lock1");
		
		try {
			if( lock.tryLock() ) {
				System.out.println("拿到锁了做点事");
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
    	return "{}";
    }
	
	@PostMapping("t2")
    public String t2() {
		
		RLock  lock1 = redissonClient.getLock("lock1");
		RLock  lock2 = redissonClient.getLock("lock2");
		RLock  lock3 = redissonClient.getLock("lock3");
		
		
		RLock  lockMulti = redissonClient.getMultiLock(lock1,lock2,lock3);
		try {
			if( lockMulti.tryLock() ) {
				System.out.println("lockMulti拿到锁了做点事");
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
    	return "{}";
    }

9 redison 提供了  原子的 long 和 double ,可以对 原子的线程安全的修改 数据

  getAndAdd 相当于i++,addAndGet 相当于++i

		RAtomicDouble  rdouble = redissonClient.getAtomicDouble("money");
		
		double d1 = rdouble.getAndAdd(1);
		double d2 = rdouble.addAndGet(1);
		
		System.out.println(d1);
		System.out.println(d2);

10 并且提供了 二进制流,各种队列,各种集合,布隆过滤器,桶,GEO,发布订阅模型

11 redison 提供了 countDownLatch 数量下降锁

		RCountDownLatch  rCountDownLatch = redissonClient.getCountDownLatch("");
		rCountDownLatch.trySetCount( 100 );
		rCountDownLatch.countDown();
		

  
12  RedissonRedLock ,这个是个分布式多节点锁。只要获取超过一半的锁就算成功

备注:Redison 提供了自动续租的分布式锁,但是我们不能一味的就用自动续期的锁,很多时候我们不希望无限的等锁,redis 默认的会自动过期的锁就够了。添加用户判断用户名是否重复,一般等几秒等不到锁具注册失败就行了,在默写情况比如执行一个长耗时的任务,这时候我们才可能会需要无限等待的锁。