如何用 Spring Boot 一行注解搞定分布式锁?——介绍 distributed-lock-spring-boot-starter

24 阅读3分钟

在分布式系统里,多个服务实例对同一个资源(比如订单、库存、用户余额)进行并发访问时,很容易出现 数据不一致、重复处理等问题
这时我们就需要 分布式锁 来控制访问顺序,确保同一时刻只有一个线程/服务在处理关键业务。

今天给大家推荐一个简洁、易用、基于 Spring Boot 的分布式锁 Starter ——
distributed-lock-spring-boot-starter

👉 项目地址:
github.com/ChildrenGre…

👉 使用demo:
github.com/ChildrenGre…


一、Starter 是什么?能为你解决什么

distributed-lock-spring-boot-starter 是一个开源的 Spring Boot Starter 插件,提供了注解驱动的分布式锁能力

核心价值

  • 最小侵入:只需在方法上加注解,不改业务代码结构
  • 多种后端支持:Redisson、ZooKeeper(Curator)、etcd(jetcd)
  • 多种锁类型:可重入锁、公平锁、读写锁等
  • SpEL 动态 key:灵活定义锁粒度
  • Spring Boot 自动配置:开箱即用
  • Apache-2.0 许可证:放心商用

二、核心功能亮点

1️⃣ 注解驱动,一行搞定分布式锁

@DistributedLock(
    key = "#orderId",
    prefix = "order",
    waitTime = 3,   // 最长等待时间(秒)
    leaseTime = 10, // 锁持有时间(秒)
    lockType = LockType.FAIR
)
public void process(String orderId) {
    // 核心业务逻辑
}

说明:

  • key 支持 SpEL 表达式
  • 锁 key 支持统一前缀,避免冲突
  • 支持公平锁 / 可重入锁 / 读写锁
  • 自动选择已注册的锁实现

2️⃣ 多种后端支持,适配你的基础设施

后端实现典型用途
Redisson(Redis)性能高,业务锁首选
ZooKeeper(Curator)强一致协调场景
etcd(jetcd)云原生、控制面

Starter 会根据 classpath 自动识别可用的锁后端。


3️⃣ 灵活的锁类型支持

锁类型适用场景
REENTRANT普通业务互斥
FAIR防止线程饥饿
READ / WRITE读多写少场景

三、如何使用?三步即可上手

1️⃣ 引入依赖

<dependency>
  <groupId>com.childrengreens</groupId>
  <artifactId>distributed-lock-spring-boot-starter</artifactId>
  <version>${latest-version}</version>
</dependency>

并根据需要引入 Redisson / Curator / jetcd 客户端依赖。


2️⃣ 基础配置示例(以 Redis + Redisson 为例)

spring:
  redis:
    host: 127.0.0.1
    port: 6379

distributed:
  lock:
    provider: redisson
    prefix: lock

3️⃣ 业务方法加锁

@DistributedLock(
    key = "#user.id",
    waitTime = 5,
    leaseTime = 15,
    lockType = LockType.REENTRANT
)
public void updateProfile(User user) {
    // 并发安全的业务逻辑
}

无需关心锁的底层实现,只关注业务本身。


四、为什么推荐使用这种 Starter?

手写分布式锁往往容易踩坑:

  • ❌ 锁误释放 / 死锁
  • ❌ 不支持可重入 / 公平性
  • ❌ 与业务代码强耦合
  • ❌ 多后端难以维护

而这个 Starter 提供:

  • 注解级抽象
  • 多实现统一接口
  • 完整的生命周期管理
  • 更低的心智负担

五、典型实战场景

秒杀 / 扣库存

@DistributedLock(key = "#productId", leaseTime = 10, waitTime = 2)
public void seckill(String productId) {
    // 扣库存、生成订单
}

分布式定时任务防重

@Scheduled(cron = "0 */5 * * * ?")
@DistributedLock(key = "'scheduled-job'", leaseTime = 60)
public void job() {
    // 多实例下只会执行一次
}

六、总结

distributed-lock-spring-boot-starter 是一个:

  • 清晰
  • 解耦
  • 可扩展
  • 面向真实业务场景

的分布式锁解决方案。

如果你正在使用 Spring Boot,并且业务中存在并发写、定时任务、多实例执行等问题,非常值得一试。

👉 GitHub 项目地址:
github.com/ChildrenGre…

欢迎 ⭐ Star、Issue、PR,一起把这个 Starter 打磨得更好 🚀