一起养成写作习惯!这是我参与「掘金日新计划 · 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 目标:
- 随着学习 把一些坑解决 形成一个 redission的基础组件
代码地址: gitee.com/gf-8/yuye-p…
项目: yuye-test-redission
类地址: 对应的test 包之下Test类
11 思考题
redLock MultiLock 的应用场景分别为什么