21 除了redission你还知道哪些分布式锁的实现

vvEcho 2025-03-05 12:13:25
Categories: Tags:

1. 基于数据库的锁(天然的分布式锁)

原理:通过数据库表的唯一约束或乐观锁实现。

唯一索引锁:插入一条代表锁的记录,利用唯一索引冲突阻止并发。

乐观锁:通过版本号或时间戳字段实现 CAS(Compare and Swap)。

缺点:性能低:高并发下数据库压力大。

无自动续期:需手动处理锁超时和死锁。

适用场景:低并发、简单业务场景

2.ApacheCurator(基于ZooKeeper)

原理:利用 ZooKeeper 的临时顺序节点(Ephemeral Sequential Nodes)和 Watcher 机制实现锁的互斥和阻塞。

核心类:InterProcessMutex,提供 acquire() 和 release() 方法。

1
2
3
4
5
6
7
8
InterProcessMutex lock = new InterProcessMutex(client, "/locks/order");
if (lock.acquire(30, TimeUnit.SECONDS)) {
try {
// 执行业务逻辑
} finally {
lock.release();
}
}

优势:强一致性:ZooKeeper 的 CP 特性保证锁的强一致性。

自动释放:客户端断开连接时,临时节点自动删除,避免死锁。

可重入性:支持同一线程多次获取锁。

适用场景:对一致性要求极高的场景(如金融交易)

3.Spring Integration(基于Redis)

原理:Spring 生态提供的分布式锁抽象,支持多种存储后端(如 Redis、JDBC)。

核心类:RedisLockRegistry,通过 obtain() 方法获取锁。

1
2
3
4
5
6
7
8
9
LockRegistry lockRegistry = new RedisLockRegistry(redisConnectionFactory, "lockPrefix");
Lock lock = lockRegistry.obtain("orderLock");
if (lock.tryLock(10, TimeUnit.SECONDS)) {
try {
// 执行业务逻辑
} finally {
lock.unlock();
}
}

优势:轻量级:无需引入额外依赖(若已使用Spring生态)。

多存储支持:可切换为JDBC或ZooKeeper后端。

缺点:功能较 Redisson 简单,需自行处理锁续期和重试