redison 自動續期的 分布式鎖


1 導入 maven

		  <dependency>
		    <groupId>org.redisson</groupId>
		    <artifactId>redisson</artifactId>
		    <version>3.11.1</version>
		 </dependency>

 

 

 

 

 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 默認的會自動過期的鎖就夠了。添加用戶判斷用戶名是否重復,一般等幾秒等不到鎖具注冊失敗就行了,在默寫情況比如執行一個長耗時的任務,這時候我們才可能會需要無限等待的鎖。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM