文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

玩转Redis-老板带你深入理解分布式锁

2020-02-11 15:40

关注

玩转Redis-老板带你深入理解分布式锁

老板:我们每天不都在经历分布式锁吗,我来给你回忆回忆。
小猿:好勒,瓜子板凳已备好。

本文结构

1、为什么要使用分布式锁

这个问题应该拆分成以下2个问题回答。

1.1、为什么使用锁

保证在同一时刻共享资源只能被一个客户端访问;
根据锁用途分为以下两种:

1.1.1、仅允许一个客户端访问

共享资源的操作不具备幂等性。
常见于 数据的修改、删除操作;
2004LockOneOp.png

在上面的例子中,

人物事件 系统含义
经理A-N 多个线程
码农小猿-调高空调温度 非幂等共享资源
秘书的允许 获取锁

1.1.2、允许多个客户端操作

主要应用场景是:共享资源的操作具有幂等性;
如 数据的查询。
既然都具有幂等性了,为什么还需要分布式锁呢,通常是为了效率或性能,避免重复操作(尤其是消耗资源的操作)。例如我们常见的缓存方案。

2004LockMoreOp.png 在上面的例子中,
人物事件 | 系统含义 ---|--- 经理A-N | 多个线程 码农小猿-整理昨天的资料 | 幂等共享资源 秘书的允许 | 获取锁 自己存资料 | 缓存

由于此处的资源是幂等的,通常会将这类资源做缓存,这就是常见的锁+缓存架构。 常适用于 获取较为消耗资源(时间、内存、CPU等)的幂等资源,如:

当然,如果资源仅在一段时间范围内具有幂等性,这时候,架构就应该升级了:
锁+缓存+缓存失效/失效重新获取/缓存定时更新

1.2、锁为什么需要分布式的?

还是以上面的缓存方案为例,此处略作变化。

2004LockDistributed.png

人物事件 系统含义
系统A、B 彼此独立的系统
码农小猿-调高空调温度 非幂等共享资源
李秘书的允许 获取锁
王秘书的允许 获取锁
李秘书、王秘书信息绝对互通 单一锁升级为分布式锁

2、高级分布式锁有哪些特点?

2.1、互斥性

PS:如果多个客户端都能同时获得锁,那锁就没意义了,共享资源的安全性也就无法保证了。

老板:当我在会议室接待客户A时,其他客户只有等待,你需要等到我空闲了才能把其他人带到我办公室。
小猿:明白。
接待客户(非幂等共享资源);等到老板空闲(获取锁)。

2.2、可重入性

例如:客户端A获取锁,锁释放时间为10S,即将到达10S时,客户端A未完成任务,需要再申请5S。若锁没有可重入性,客户端A将无法续约,导致锁可能被其他客户端抢走。

小猿:受教了,老板3分钟后你还有一场面试。
老板:小猿啊,难得你这么好学,我很欣慰,我们的交流时间延10分钟吧,其他会议延后。

2.3、高性能

小猿:好的,我已在钉钉申请将会议延长10分钟了;
老板:嗯,我已经接受会议邀请了;
小猿:老板你真高效。

2.4、高可用

分布式、微服务环境下,必须保证服务的高可用,否则轻则影响其他业务模块,重则引发服务雪崩。

老板:我手机24小时开机,有会议时联系不上我也可以联系我秘书。

2.5、支持阻塞和非阻塞式锁

锁阻塞性 示例
非阻塞式 常见的工单系统,员工A、B同时想操作订单1(抢单)。当员工A获得锁并如愿操作订单1;员工B获取锁失败,不能一直阻塞,应该告知失败,让员工B去做其他事,否则员工B就光明正大上班划水了。
阻塞式 打电话给老板审核方案,老板在通话中(获取锁失败),此时需要每隔一段时间就给老板打电话,直到联系上老板才行。谁让老板下了死命令今天必须审核通过呢,呜呜呜。

2.6、解锁权限

常见的解决方案是,给锁加随机数(或ThreadID)。

老板:小猿啊,给你讲了这么多,都明白了吗?
笼子里的鹦鹉:明白啦,明白啦。
老板:闭嘴,我问的是小猿,只有小猿自己有资格回答。

2.7、避免死锁

秘书破门而入:老板,你们10分钟的会议已经到点了,隔壁的李总已经等不及了;

老板:一不留神就忘记时间了,我得去见李总了。

小猿:老板,我们还没聊完呢,,,

2.8、异常处理

小猿:不管出现哪种情况,我获取锁都会失败啊,这可怎么办呢?
PS:这就复杂了,需要根据具体的业务场景分析。对于必须同步处理的业务,则必须失败告警,对于允许延迟处理的业务可以考虑记录失败信息待其他系统处理。

3、分布式锁流行算法

3.1、基本方案SETNX

基于Redis的SETNX指令完成锁的获取;

3.1.1、获取锁 SET lock:resource_name random_value NX PX 30000

lock:resource_name:资源名字,加锁对象的唯一标记;
random_value:通常存储加锁方的唯一标记,如“UUID+ThreadID”;
NX:key不存在才设置,即锁未被其他人加锁才能加锁;
PX:锁超时时间;

当然,此种加锁方式是不支持“锁重入性”的。

3.1.2、释放锁(LUA脚本)

checkValueThenDelete:检查解锁方是否是加锁方,是则允许解锁,否则不允许解锁;
伪代码是:

public class RedisTool {
    // 释放锁成功标记
    private static final Long RELEASE_LOCK_SUCCESS = 1L;

    
    public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String lockValue) {
        String script = "" +
                "if redis.call("get", KEYS[1]) == ARGV[1] then" +
                "    return redis.call("del", KEYS[1]) " +
                "else" +
                "    return 0 " +
                "end";
        // Collections.singletonList():用于只有一个元素的场景,减少内存分配
        Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(lockValue));
        if (RELEASE_LOCK_SUCCESS.equals(result)) {
            return true;
        }
        return false;
    }
}

3.2、Redlock算法

此算法由Redis作者antirez提出,作为一种分布式场景下的锁实现方案;

3.2.1、Redlock算法原理

【核心】大多数节点获取锁成功且锁依旧有效;

2004Redlock.png

3.2.2、Redlock算法优点

3.2.3、Redlock算法问题点

3.3、带fencing token的实现

分布式系统专家Martin Kleppmann讨论提出RedLock存在安全性问题;

3.3.1、神仙之战

Martin Kleppmann认为Redis作者antirez提出的RedLock算法有安全性问题,双方在网络上多轮探讨交锋。Martin指出RedLock算法的核心问题点如下:

3.3.2、fencing token算法原理

3.3.3、fencing token算法问题点

3.4、其他分布式锁

3.4.1、数据库排它锁

3.4.2、ZooKeeper分布式锁

3.4.3、Google的Chubby分布式锁

4、总结

4.1、我们该使用怎样的分布式锁算法?

4.2、分布式锁的另类玩法

敬请关注后续《玩转Redis》系列文章。

>祝君好运!
Life is all about choices!
将来的你一定会感激现在拼命的自己!
【CSDN】【GitHub】【OSCHINA】【掘金】【语雀】【微信公众号】

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯