MAC-在使用@Async注解的方法时,分布式锁管理和释放
在使用 @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 添加依赖