Redission 分布式锁(七)RedLock

371 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

1 前言

研究源码 是为了解决实际问题 - 雨夜

先看 思考和应用场景的问题 思考下,然后再继续往下看

如果可以的话 点个赞/评论下 哈哈 好有点动力 有问题 也请留言

2 背景

3 思考

1 redLock MultiLock 锁都是锁多个,有什么区别呢?
2 

4 应用场景

5 redLock

5.1 参数说明

failedLocksLimit 可失败的锁次数 锁的size - ((锁的size / 2) + 1)
calcLockWaitTime 
    Math.max(remainTime / locks.size(), 1); 
    Math.max(4500 / 3, 1); 
    1500ms

5.2 加锁

一次加锁,相继剪掉超时时间 
如果超时时间不够就 把之前加锁的 解锁

5.3 解锁

List<RFuture<Void>> futures = new ArrayList<>(locks.size());
for (RLock lock : locks) {
    futures.add(lock.unlockAsync());
}

for (RFuture<Void> unlockFuture : futures) {
    unlockFuture.awaitUninterruptibly();
}
RedissonPromise 类 awaitUninterruptibly 方法
-》
DefaultPromise 类中 awaitUninterruptibly 方法
检查是否为死锁,就是遍历线程池 找死锁的

@Override
public void unlock() {
    List<RFuture<Void>> futures = new ArrayList<>(locks.size());

    for (RLock lock : locks) {
        futures.add(lock.unlockAsync());
    }

    for (RFuture<Void> future : futures) {
        future.syncUninterruptibly();
    }
}

就是分别解锁,其实还是调用的RedissionLock的unlock 方法 解锁成功 返回1

7 思考题回答

7.1 redLock MultiLock 锁都是锁多个,有什么区别呢?

都假设 要锁3个
redLock   每个lockKey 超时时间分别为1500ms RedissonRedLock是基于RedissonMultiLock 继承的
MultiLock 3个锁共用4500ms的超时时间 可能一个锁就用了4.5s的超时时间

8 总结:

其实redission 后面几种都是前面的进行重新组合
redLock 用的比较少,如果用分布式锁 可以用zk etcd 但是如果不想引入其他组件(比如 zk etcd)就直接用redis 单机就行,比如阿里云的redis 里面官方方案 直接redis操作就行,说是redis 稳定,单机就行。很长时间了,我记得是这么写的

9 下节预知

后面会快速过
然后找实际的问题,来分析问题再来补充这些文档

10 目标:

  1. 随着学习 把一些坑解决 形成一个 redission的基础组件

代码地址: gitee.com/gf-8/yuye-p…

项目: yuye-test-redission

类地址: 对应的test 包之下Test类

11 思考题

redLock MultiLock 的应用场景分别为什么