RedLock 算法是一种基于 Redis 实现的分布式锁的方法,主要用来解决 Redis 的单点问题,详细算法细节见上文。
在我们常用的 Redisson 中是支持 RedLock 的,但是在后续的版本中已经被废弃(Deprecated)了:
导致 Redisson 废弃 RedLock ,可能有以下几个原因:
当然,以上只是一些猜测,主要其实就是官方不认可,并且作者表示也不承担责任,所以在 Redisson 这种框架中就不再支持他了。
那么,在 RedLock 不再被建议使用之后,到底有什么方案来解决这种集群中的一致性问题导致的重复加锁呢?
这个在业内并没有公认的方案。在实践中,可以有以下几个方案:
1、这个方案我说出来可能会被喷,但是还是要提一下,因为他确实有效。那就是使用单实例的 Redis 锁,虽然这样的方案会面临单点故障的问题,但是在一些可以容忍短暂的服务中断的场景,用的还是比较多的。
2、还是用普通的锁,如 SETNX、redisson 等,但是在业务逻辑中做好幂等控制及状态及校验(比如数据库的唯一性约束),以及各种对账。这样就可以避免真的出现因为Redis 的集群一致性出现问题导致重复加锁时,导致业务出现问题。主要业务没问题,其实就不算问题了。
3、使用那种强一致性的组件来实现分布式锁,如 ZooKeeper、etcd 或 Consul,这些系统提供了更强大的一致性保证,适用于需要严格一致性的分布式应用。这些系统使用类似于 Raft 或 Paxos 的一致性算法来保证数据的一致性和分布式锁的安全性。