分布式锁组件
Maven坐标
<dependency>
<groupId>com.ikingtech.framework</groupId>
<artifactId>sdk-lock</artifactId>
</dependency>
分布式锁简要说明
关键类解析
DistributeLockConfiguration
这是一个配置类,它提供了两个 Bean:RedisLockRegistry 和 DistributeLock。
RedisLockRegistry
: 基于 Lettuce 提供的 Redis 连接工厂创建。"dist_lock" 是所有分布式锁在 Redis 中共享的前缀。DistributeLock
: 基于 RedisLockRegistry 创建的分布式锁实例。
DistributeLock
这是一个分布式锁的接口,包含了两个方法
tryLock(String lockKey, Long expireSecond)
:尝试获取指定 key 的锁,锁的有效期为 expireSecond 秒。返回值为 true 表示获取锁成功,false 则表示失败。unlock(String lockKey)
:释放指定 key 的锁。
RedisDistributeLock
这是
DistributeLock
接口的一个实现,它将实际的锁操作委托给了 RedisLockRegistry。tryLock()
方法首先从 RedisLockRegistry 获取一个 Lock 对象,然后尝试对其加锁。如果发生 InterruptedException 异常,会打印错误日志并重置当前线程的中断状态,最后返回 false。在 finally 块中,会解锁并清理超过 60 秒未使用的锁。unlock()
方法从 RedisLockRegistry 获取一个 Lock 对象,然后释放锁。如果发生任何异常,将打印错误日志。
使用流程
使用方式
🙅注意
下面的仅是使用示例,不代表所有用法。
- 通过pom文件引入依赖。
<dependency>
<groupId>com.ikingtech.platform</groupId>
<artifactId>service-lock</artifactId>
</dependency>
- 使用示例
- 在需要使用分布式锁的类中,首先注入 DistributeLock 实例:
@Autowired
private DistributeLock distributeLock;
然后,在需要同步控制的代码块周围使用 tryLock() 和 unlock() 方法:
// 锁标识和过期时间
String lockKey = "your_lock_key";
Long expireSecond = 60L;
// 尝试获取锁
if (distributeLock.tryLock(lockKey, expireSecond)) {
try {
// 这里写你的业务逻辑
}finally {
// 释放锁
distributeLock.unlock(lockKey);
}
} else {
// 获取锁失败,进行相应处理
}
注意事项
注意
在 finally 中释放锁是一种比较好的做法,因为它能确保无论业务逻辑是否出现异常,锁都会被释放,避免出现死锁情况。