redisson的Lock,SpinLock与FencedLock

Lock

 

redisson的基本lock实现, 使用发布订阅机制实现通信

可以查看源码中pubSub的相关使用

SpinLock


使用"Exponential Backoff strategy"指数退避策略实现的分布式锁,区别于基本的RedissonLock的发布订阅模式,SpingLock使用的是有规律的不断重试来获取锁信息,他可以解决几千个对象竞争锁带来的redis的cpu飙升问题
Exponential Backoff strategy具体的实现就是设定一个初始时间来竞争锁,如果失败就不断翻倍这个时间,这个时间在SpinLock中有最大值

image

FencedLock

image

这种类型的锁会维护隔离令牌,以避免客户端由于长时间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();
   }
}

参考

官方文档

posted @ 2022-12-28 15:11  大哥超帅  阅读(958)  评论(0编辑  收藏  举报