微服务项目中,很多资源需要互斥使用,比如一些分布式任务,比如下单的处理,退货的处理等等。这些都需要用到借助分布式锁来保证处理的唯一性。 一开始我们也手工实现了分布式锁,但是随着业务的发展,我们对锁的特性也要求越来越完善,最后选用了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");
//创建所
RLock helloLock = redissonClient.getLock("hello");
//加锁
helloLock.lock();
try {
log.info("locked");
Thread.sleep(1000 * 200);
} finally {
//释放锁
helloLock.unlock();
}
log.info("finished");
}
}
- 特性
- 可重入的(使用hash数据结果保存,其中hash key是client id,value是重入次数)
- 不间断的(默认锁的到期时间是30秒,如果没有释放,则当到期时间为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等