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