前言
分布式鎖應用場景相當廣,利用redis, RDB(mysql, oracle ...), ZK等來達成的例子所在多有。
Spring Integration 提供了一個可切換的分布式鎖機制,可以避免大家自行重新開發。
使用Redis主要是因為效率高,其他類型的效率慢上好幾個等級,當然如果是應用在早期的系統,使用mysql也是方便的選擇。
準備
Dependencies
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-redis</artifactId>
</dependency>
需要加入上列的libraries
configuration
@Bean
public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
return new RedisLockRegistry(redisConnectionFactory, "eckey");
}
配合Redis,使用RedisLockRegistry
Sample
@GetMapping(path = "/lock")
public String lockAndDo() {
/*
1. Obtain
2. TryLock
3. Unlock
*/
String lockKey = "SKU_2020_NIKE_AJ_M_BlUE_9";
log.info("Try to get Lock with key[{}]", lockKey);
Lock lock = redisLockRegistry.obtain(lockKey);
try {
boolean lockStatus = lock.tryLock(10, TimeUnit.SECONDS);
log.info("Lock with key[{}] is [{}]", lockKey, lockStatus);
if (lockStatus) {
try {
/*
Do our process here
*/
// pretend to be busy.
TimeUnit.SECONDS.sleep(5);
} finally {
log.info("Unlock key[{}] success!", lockKey);
lock.unlock();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return "Finish";
}
簡單4步驟
- 決定要鎖的key,像是SKU
- Obtain Lock
- Try to Lock
- Unlock
與Sample一樣,就能為系統增加分布鎖的功能。