spring-redis 自带分布式锁实现
前言
以前还傻傻的自己写分布式锁实现:基于缓存或 zookeeper 的分布式锁实现。果然,你能想到的轮子,99% 都已经有人造好了,并且,比你自己造的好的多。
RedisLockRegistry
- 依赖
implementation("org.springframework.boot:spring-boot-starter-data-redis")
implementation("org.springframework.integration:spring-integration-redis")
- 配置
@Configuration
class RedisLockConfiguration {
@Bean
fun redisLockRegistry(redisConnectionFactory: RedisConnectionFactory): LockRegistry {
return RedisLockRegistry(redisConnectionFactory, "redis-lock", 60000L * 60)
}
}
LockRegistry
除了提供 RedisLockRegistry
的实现,还提供了 DefaultLockRegistry
等单机锁实现;
RedisLockRegistry
提供了两种 Redis 分布式锁实现,一种是 RedisSpinLock
,通过周期性(100ms)检查是否可以获取锁来获取锁;一种是 RedisPubSubLock
,锁是通过 redis pub-sub 订阅获取的;默认是 RedisSpinLock
。
- 使用
val lock = lockRegistry.obtain("lock")
if (lock.tryLock()) {
try {
// 业务实现
} finally {
lock.unlock()
}
}