Skip to content

分布式锁组件

Maven坐标

xml
<dependency>
    <groupId>com.ikingtech.framework</groupId>
    <artifactId>sdk-lock</artifactId>
</dependency>

分布式锁简要说明


关键类解析

  1. DistributeLockConfiguration

    这是一个配置类,它提供了两个 Bean:RedisLockRegistry 和 DistributeLock。

    • RedisLockRegistry: 基于 Lettuce 提供的 Redis 连接工厂创建。"dist_lock" 是所有分布式锁在 Redis 中共享的前缀。

    • DistributeLock: 基于 RedisLockRegistry 创建的分布式锁实例。

  2. DistributeLock

    这是一个分布式锁的接口,包含了两个方法

    • tryLock(String lockKey, Long expireSecond):尝试获取指定 key 的锁,锁的有效期为 expireSecond 秒。返回值为 true 表示获取锁成功,false 则表示失败。

    • unlock(String lockKey):释放指定 key 的锁。

  3. RedisDistributeLock

    这是 DistributeLock 接口的一个实现,它将实际的锁操作委托给了 RedisLockRegistry。

    • tryLock() 方法首先从 RedisLockRegistry 获取一个 Lock 对象,然后尝试对其加锁。如果发生 InterruptedException 异常,会打印错误日志并重置当前线程的中断状态,最后返回 false。在 finally 块中,会解锁并清理超过 60 秒未使用的锁。

    • unlock() 方法从 RedisLockRegistry 获取一个 Lock 对象,然后释放锁。如果发生任何异常,将打印错误日志。

使用流程


使用方式

🙅注意

下面的仅是使用示例,不代表所有用法。

  1. 通过pom文件引入依赖。
xml
<dependency>
	<groupId>com.ikingtech.platform</groupId>
	<artifactId>service-lock</artifactId>
</dependency>
  1. 使用示例
  • 在需要使用分布式锁的类中,首先注入 DistributeLock 实例:
java
@Autowired
private DistributeLock distributeLock;

然后,在需要同步控制的代码块周围使用 tryLock() 和 unlock() 方法:

java
// 锁标识和过期时间
String lockKey = "your_lock_key";
Long expireSecond = 60L;

// 尝试获取锁
if (distributeLock.tryLock(lockKey, expireSecond)) {
    try {
        // 这里写你的业务逻辑
    }finally {
        // 释放锁
        distributeLock.unlock(lockKey);
    }
} else {
    // 获取锁失败,进行相应处理
}

注意事项

注意

在 finally 中释放锁是一种比较好的做法,因为它能确保无论业务逻辑是否出现异常,锁都会被释放,避免出现死锁情况。