分散式鎖redisson的使用 看門狗原理
阿新 • • 發佈:2020-12-10
分散式鎖redisson 的使用
1、引入依賴
<!-- 以後使用Redisson作為所有分散式鎖,分散式框架等功能框架 -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.12.0</version>
</dependency>
2、配置類
@Configuration
public class MyRedissonConfig {
/**
* 所有對Redisson的使用都是通過RedissonClient
*/
@Bean(destroyMethod="shutdown")
public RedissonClient redisson(){
//1、建立配置
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
//2、根據Config創建出RedissonClient例項
RedissonClient redisson = Redisson.create(config);
return redisson;
}
}
3、測試:
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private RedissonClient redisson;
@Test
public void redissonTest() {
System.out.println (redisson);
}
}
//列印
org.redisson.Redisson@30dd00b6
redission 自動續期,看門狗原理
模擬業務超時:
@GetMapping(value = "/hello")
@ResponseBody
public String hello() {
//1、獲取一把鎖,只要鎖的名字一樣,就是同一把鎖
RLock lock = redisson.getLock("my-lock");
//2、加鎖 預設加鎖時間30s
lock.lock();
try {
System.out.println("加鎖成功,執行業務..." + Thread.currentThread().getId());
TimeUnit.SECONDS.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//3、解鎖
System.out.println("釋放鎖..." + Thread.currentThread().getId());
lock.unlock();
}
return "hello";
}
lock.lock();
是阻塞式等待的,預設加鎖時間是30s;如果業務超長,執行期間會自動續期到30s。不用擔心業務時間長,鎖自動過期被刪掉;加鎖的業務只要執行完成,就不會給當前鎖續期,即使不手動解鎖,鎖預設會在30s內自動過期,不會產生死鎖問題;
也可以自己指定解鎖時間lock.lock(10,TimeUnit.SECONDS)
,10秒鐘自動解鎖,自己指定解鎖時間redis不會自動續期;
指定解鎖時間帶來的問題:如果業務執行的時間超過指定時間,redis會自動解鎖;當前業務執行完後又要解鎖,可能會解鎖到另一條執行緒加的鎖,所以自己指定的解鎖時間一定大於業務執行的時間!
看門狗原理
1、如果我們指定了鎖的超時時間,就傳送給redis執行指令碼,進行佔鎖,預設超時就是我們制定的時間,不會自動續期;
2、如果我們未指定鎖的超時時間,就使用 lockWatchdogTimeout = 30 * 1000
【看門狗預設時間】
只要佔鎖成功,就會啟動一個定時任務【重新給鎖設定過期時間,新的過期時間就是看門狗的預設時間】,每隔10秒都會自動再續成30秒;
自動續期時間:internalLockLeaseTime 【看門狗時間 30s】 / 3, 10s