笔趣阁

爱去小说网>意外成为残疾总监的心尖宠 > 第42章(第1页)

第42章(第1页)

苏执把笔记本放在自己面前的小桌板上,指尖在触控板上点了几下,打开一个空白的编辑器,一边敲一边说:“方案有很多,数据库悲观锁、Redis的setnx、Zookeeper的临时顺序节点,你用哪个?”

明灿凑过去看,苏执的手指在键盘上敲得很快,一行一行的基础代码出现在屏幕上,不是完整的实现,而是一个骨架——锁的接口定义、加锁解锁的基本流程、异常处理的框架。

“Redis。”

明灿说,语气里带着一点不确定,“用setnx,配合1ua脚本保证原子性,设置过期时间避免死锁。”

苏执停下来,侧过脸看了她一眼。那一眼很淡,但明灿觉得自己被从头到脚审视了一遍,像面试时被技术总监盯着等回答的那种感觉,心跳不由自主地加快了几拍。

“继续。”

苏执说。

明灿深吸一口气,开始说:“加锁的时候用setnx,如果返回成功就拿到锁,同时设置一个过期时间比如三十秒。如果返回失败说明锁被其他实例占用,可以重试或者直接放弃。锁的持有者需要在业务逻辑执行完之后释放锁,删除对应的key。为了防止a线程的锁被B线程释放,va1ue要用一个唯一标识,比如uuId或者线程Id,释放的时候先get再判断,匹配了才能de1。”

她说完,怯生生看着苏执。

苏执没有立刻表态,低下头在键盘上又敲了几行,然后把屏幕转向明灿。

屏幕上是一个完整的Redis分布式锁实现,用1ua脚本把判断和删除两个操作合并成一个原子操作,避免了get和de1之间的时间窗口。明灿一行一行地看,看到最后一行的时候,现苏执还在代码末尾加了一行注释:考虑使用Redisson的RLock,自动续期机制更优雅。

明灿盯着那行注释看了两秒,然后抬头看苏执:“姐姐,你这是……在教我写代码,还是在给我做代码审查?”

“都是。”

苏执的声音很淡,但嘴角有一个极其细微的弧度,像是克制过但没完全克制住,“你刚才说的方案里,漏了一个关键问题。”

明灿愣了:“什么?”

“锁过期了但业务还没执行完怎么办?”

明灿张了张嘴,又闭上了。

她确实漏了这个。

如果设置的过期时间是三十秒,但业务逻辑执行了四十秒,那么锁在第三十秒的时候就会自动释放,另一个实例拿到锁进来执行同样的任务,等第一个实例执行完再释放锁的时候,释放的是第二个实例的锁。后果很严重——锁的持有者被误删,第二个实例以为自己还有锁,实际上锁已经被别人干掉了。

“所以需要锁续期。”

苏执说,“拿到锁之后启动一个后台线程,每隔一段时间检查一下锁是否还在,如果还在就延长过期时间。业务执行完再取消续期,释放锁。”

明灿听得认真,眉头微微皱着,脑子里在消化这个方案。她想了想,问了一个问题:“那如果持有锁的实例突然宕机了,续期线程也挂了,锁是不是就永远不释放了?”

苏执看了她一眼,那一眼里多了一点东西——不是夸奖,但比夸奖更让明灿受用,那是一种“你终于开始想边缘情况了”

的认可。

“所以Redis分布式锁有一个经典的缺陷,就是这个问题。严格意义上来说,它做不到百分之百的绝对安全,只能做到百分之九十九点九九。”

苏执的语气不紧不慢,像在讲一门精心准备过的课,“如果需要更高的一致性,可以考虑Zookeeper或者etcd,它们的分布式锁是基于临时顺序节点和会话心跳实现的,客户端宕机了节点会自动删除,不会有死锁问题。”

她说完,停了一下,看着明灿。

明灿在笔记本上飞快地记着,写到一半忽然抬头:“姐姐,你这些东西你刚开始接触的时候都是在哪学的?我们学校好像都没教过这么深。”

已完结热门小说推荐

最新标签