微服務(wù)項目中,很多資源需要互斥使用,比如一些分布式任務(wù),比如下單的處理,退貨的處理等等。這些都需要用到借助分布式鎖來保證處理的唯一性。 一開始我們也手工實現(xiàn)了分布式鎖,但是隨著業(yè)務(wù)的發(fā)展,我們對鎖的特性也要求越來越完善,最后選用了Redis官方推薦的Redisson。
Spring Boot中使用Redisson
Spring Boot使用Redisson特別簡單,只要引入一個新的jar就可以,redis的配置跟其他的redis客戶端可以兼容,可以不用再額外配置
- jar包引入
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.11.4</version>
</dependency>
- 配置
spring:
redis:
host: localhost
port: 6379
- 使用
@Slf4j
@SpringBootApplication
public class RedissonApplication implements ApplicationRunner {
/**
* 直接注入RedissonClient就可以直接使用.
*/
@Resource
private RedissonClient redissonClient;
public static void main(String[] args) {
SpringApplication.run(RedissonApplication.class, args);
}
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("spring boot run");
//創(chuàng)建所
RLock helloLock = redissonClient.getLock("hello");
//加鎖
helloLock.lock();
try {
log.info("locked");
Thread.sleep(1000 * 200);
} finally {
//釋放鎖
helloLock.unlock();
}
log.info("finished");
}
}
- 特性
- 可重入的(使用hash數(shù)據(jù)結(jié)果保存,其中hash key是client id,value是重入次數(shù))
- 不間斷的(默認鎖的到期時間是30秒,如果沒有釋放,則當(dāng)?shù)狡跁r間為20秒時,再延長至30秒)
Redisson更多類型鎖
/**
* 普通非公平重入鎖.
*/
RLock getLock(String name);
/**
* 同時獲取多把鎖.
*/
RLock getMultiLock(RLock... locks);
/**
* RedLock
*/
RLock getRedLock(RLock... locks);
/**
* 公平鎖.
*/
RLock getFairLock(String name);
/**
* 讀寫鎖
*/
RReadWriteLock getReadWriteLock(String name);
這些特性都是依靠在hash上的值來完成的,比如mode等