在使用 @Async
注解的异步方法中管理分布式锁时,需要特别注意 锁的获取、释放与异步执行的生命周期匹配。以下是结合 Spring Boot 和 Redis 分布式锁的实践方案:
1. 为什么需要分布式锁?
异步方法可能被多个线程/服务实例并发执行,若访问共享资源(如数据库、缓存),需通过分布式锁避免竞态条件。例如:
@Async
public CompletableFuture<String> processOrder(Order order) {// 需要加锁:防止多个实例同时处理同一个订单lock.lock();try {// 业务逻辑(扣减库存、更新状态等)return CompletableFuture.completedFuture("Success");} finally {lock.unlock();}
}
2. 分布式锁实现方案
推荐使用 Redis + RedLock 算法(Spring Data Redis 已内置支持)。
2.1 添加依赖