# 《分布式IM系统》通用模型-第04节:分布式锁通用代码设计与实现
作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)
课程视频:https://t.zsxq.com/15YbS6Hr5 (opens new window)
沉淀,成长,突破,帮助他人,成就自我。
- 本节难度:★★☆☆☆
- 本节重点:基于Redisson实现分布式锁的通用代码设计,使代码满足需求的同时,兼具优雅性,并具备良好的性能与扩展性。
- 课程视频:https://t.zsxq.com/15YbS6Hr5 (opens new window)
大家好,我是冰河~~
编写优雅且兼具扩展性与性能的代码需要具备扎实的编程功底,但这也是对一个程序员最基本的要求。优雅且兼具扩展性与性能的代码不仅让人看上去比较舒服,并且其良好的扩展性有助于后期的维护和升级,记得雷布斯曾经说过:我不是诗人,但我写的代码像诗一样优雅。
# 一、前言
在某种程度上,代码能够反映出一个程序员的编程功底,甚至是一个程序员的技术水平。能够编写优雅且兼具扩展性与性能代码的程序员比只顾CRUD,只会造“屎山”的程序员更受企业欢迎,所以,作为程序员的我们平时就需要培养自身扎实的编程功底和良好的代码编写能力。
# 二、本节诉求
如果一个单体应用系统中某些关键业务只能让一个线程执行,此时可以使用synchronized锁或者Lock锁实现。但是synchronized锁或者Lock锁只能解决单体应用系统下线程的互斥问题,在分布式系统场景下,synchronized锁或者Lock锁就显得力不从心了,此时,就需要使用分布式锁来解决相应的问题。
本章,就从代码层面基于Redisson实现具备良好扩展性的分布式锁。
# 三、代码设计
在设计分布式锁的代码时,将会从代码场景、代码扩展性和代码类结构等方面进行详细的说明。
# 3.1 代码场景设计
如果分布式系统中存在受保护的临界区资源,并且在同一时刻只能有一个线程对这些临界区资源进行变更操作,在这种场景下,Java中提供的synchronized锁或者Lock锁是无能为力的,此时就需要使用分布式锁来解决相应的问题。在分布式场景下,无论存在多少个应用服务,亦或是存在多少个系统实例,只要是这些应用服务或者系统实例需要互斥的更新临界区资源,使用分布式锁都能够实现在同一时刻只能有一个线程变更临界区资源,如图4-1所示。
可以看到,在分布式场景下,对临界区资源进行变更时,使用分布式锁能够实现在同一时刻只能有一个线程变更临界区资源,此时,变更临界区资源是线程安全的,不会由于多个线程同时变更临界区资源而造成线程安全的问题。
# 3.2 代码扩展性设计
这里,我们再来温习下代码具备良好扩展性的原则。总体的原则就是面向接口编程,而非面向具体的实现类编程,具体业务逻辑里依赖的是接口,而非实现类,在接口不变的前提下,可以随时切换具体的实现类,也可以随时新增接口的实现类。业务中可以根据配置加载接口的某个具体实现类。
# 查看完整文章
加入冰河技术 (opens new window) 知识星球,解锁完整技术文章、小册、视频与完整代码