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