redisson的Lock,SpinLock与FencedLock
Lock
redisson的基本lock实现, 使用发布订阅机制实现通信 可以查看源码中pubSub的相关使用
SpinLock
使用"Exponential Backoff strategy"指数退避策略实现的分布式锁,区别于基本的RedissonLock的发布订阅模式,SpingLock使用的是有规律的不断重试来获取锁信息,他可以解决几千个对象竞争锁带来的redis的cpu飙升问题
Exponential Backoff strategy具体的实现就是设定一个初始时间来竞争锁,如果失败就不断翻倍这个时间,这个时间在SpinLock中有最大值
FencedLock
这种类型的锁会维护隔离令牌,以避免客户端由于长时间GC暂停或其他原因而延迟获取锁,从而无法检测到它不再拥有锁的情况。要解决这个问题,令牌由lockAndGetToken或getToken()方法返回。令牌应该检查是否大于或等于该锁保护的服务的前一个令牌,如果为false则拒绝操作。
以下是官方文档
RFencedLock lock = redisson.getFencedLock("myLock");
// traditional lock method
Long token = lock.lockAndGetToken();
// or acquire lock and automatically unlock it after 10 seconds
token = lock.lockAndGetToken(10, TimeUnit.SECONDS);
// or wait for lock aquisition up to 100 seconds
// and automatically unlock it after 10 seconds
Long token = lock.tryLockAndGetToken(100, 10, TimeUnit.SECONDS);
if (token != null) {
try {
// check if token >= old token
//不断获取token来与之前的比较,此处如果检查结果为false说明锁失效
...
} finally {
lock.unlock();
}
}