1. 程式人生 > 其它 >分散式鎖redisson的使用 看門狗原理

分散式鎖redisson的使用 看門狗原理

技術標籤:分散式鎖redission

分散式鎖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