AI 写的 Redis 分布式锁为什么会超卖:四个错误写法和正确实现
秒杀功能要加个分布式锁。我让 AI 写它给了一段这个publicbooleantryLock(Stringkey,longtimeoutSeconds){BooleansuccessredisTemplate.opsForValue().setIfAbsent(key,1,timeoutSeconds,TimeUnit.SECONDS);returnBoolean.TRUE.equals(success);}publicvoidunlock(Stringkey){redisTemplate.delete(key);}写法看着挺标准。加锁、设过期、释放一样不缺。压测跑起来库存超卖。先看这套写法本身的问题第一value 是写死的1。意味着所有客户端写进去的值都一样。那么释放锁的时候谁都可以删。场景A 拿到锁业务执行超时锁自动过期了。B 拿到锁开始执行。A 这时候执行完了走进unlock把 B 的锁删了。C 立刻就能拿到锁进来。三个线程同时在跑临界区。第二释放锁不判断持有者。上面那个场景之所以能发生就是因为delete(key)不检查这把锁是不是自己的。第三锁超时时间不一定够。30 秒的锁业务跑了 35 秒锁先过期了。这时候另一台机器直接进来。这个问题的难点在于你没法准确预估业务耗时。今天 3 秒明天数据库慢一下变 40 秒你就中招了。第四也是最容易忽略的。上面那个写法里加锁和设过期其实是原子的setIfAbsent传了过期时间Redis 内部是一条SET key value NX PX命令没有原子性问题。但如果 AI 写成下面这样就是真的非原子了// 危险两步操作BooleansuccessredisTemplate.opsForValue().setIfAbsent(key,1);if(Boolean.TRUE.equals(success)){redisTemplate.expire(key,30,TimeUnit.SECONDS);// 单独一步}这两行之间如果服务挂了那把锁永远不会过期。后面所有请求全部阻塞。这个 bug 平时测不出来只在你最不想出事的时候出现。正确的写法长什么样基础版本加锁带过期、value 带唯一标识、释放用 Lua 比对privatestaticfinalStringUNLOCK_LUAif redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end;publicbooleantryLock(Stringkey,StringrequestId,longmillis){BooleanokredisTemplate.opsForValue().setIfAbsent(key,requestId,millis,TimeUnit.MILLISECONDS);returnBoolean.TRUE.equals(ok);}publicbooleanunlock(Stringkey,StringrequestId){LongresultredisTemplate.execute(newDefaultRedisScript(UNLOCK_LUA,Long.class),Collections.singletonList(key),requestId);returnresult!nullresult0;}关键三点requestId用 UUID每次加锁都是唯一值加锁一条命令SET NX PX原子释放用 Lua先比对再删比对和删除在 Redis 端是一条命令再往上一步自动续期上面这个版本还是没解决“业务比锁时间长”的问题。要彻底解决得有个看门狗在锁快过期的时候自动续上。Redisson 干的就是这个RLocklockredissonClient.getLock(order:orderId);try{lock.lock(30,TimeUnit.SECONDS);// 业务逻辑}finally{lock.unlock();}它内部有个后台线程每隔 10 秒默认锁时间的 1/3检查一次业务还在跑就续期。手写这个看门狗不是不行但要处理的东西不少续期线程的管理、客户端宕机的情况、续期失败怎么办。我的建议是能用 Redisson 就别手写。分布式锁这种基础设施手写出来能跑通不难跑对所有边界情况很难。AI 为什么写不对这个因为 AI 给你的不是“正确的并发代码”是“看起来正确的代码”。训练数据里分布式锁的文章绝大多数是教学性质的。讲清楚“加锁、设过期、finally 释放”这三步就够了没人会在教程里讲锁续期和持有者校验。它给你的是一个能演示的版本不是一个能上线的版本。这两个之间的差距就是超卖的库存数。一句话分布式锁这东西最危险的状态不是“没加锁”是“以为加了锁”。没加锁你会老老实实做幂等、做库存校验。以为加了锁你就把那些防线全撤了。我把这段代码和修复版整理了一下回头顺手查查你们项目里的锁value 是不是写死的字符串。你见过最离谱的分布式锁是怎么写的说出来让我开开眼。

相关新闻

Go服务集成身份证OCR:风控实名认证的识别与校验方案

Go服务集成身份证OCR:风控实名认证的识别与校验方案

做风控开发的同行应该都有同感:实名认证这一关,是合规审查链路里最绕不开的环节。无论是信贷、支付还是租赁场景,用户提交身份证照片的那一刻,你的系统就要开始面对一连串问题——这照片是原件还是复印件?有没有被PS过…

2026/10/10 9:19:57 阅读更多 →
基于MFC的LALR(1)分析表自动构造:从文法到可视化桌面程序

基于MFC的LALR(1)分析表自动构造:从文法到可视化桌面程序

简介:本资源面向编译原理课程学习者与课程设计开发者,提供一套基于MFC实现的LALR(1)分析表自动构造程序,帮助理解并实践从LR(1)项目集规范族到LALR(1)分析表构造的完整流程。压缩包共52个文件,约63.55MB,包含设计报告W…

2026/10/10 9:19:57 阅读更多 →
10.09日学习内容

10.09日学习内容

1.pandas数据的写入与输出代码:import pandas as pd#读取数据 dfpd.read_csv("data/sales.csv",usecols[订单号,产品类别,产品名称,销售数量,单价])#数据处理 df[销售金额]df[销售数量]*df[单价]#写入数据---to_csv df.to_csv("data/sales01.csv&quo…

2026/10/10 9:18:57 阅读更多 →

最新新闻

秘密持股与董事会反杀:非营利转盈利背后的股权暗战剖析

秘密持股与董事会反杀:非营利转盈利背后的股权暗战剖析

1. 事件拆解:从一组日记看一场迟到的商业路线之争1.1 日记里到底写了什么这几年看了不少科技圈的股权纠纷,说实话,大多数都藏在仲裁庭和保密协议后面,外人只能看到一地鸡毛。但这回不一样,一份内部核心团队成员的日记被…

2026/10/10 10:39:50 阅读更多 →
Windows网络登录认证机制全解析:从凭据缓存到Kerberos票据排查实战

Windows网络登录认证机制全解析:从凭据缓存到Kerberos票据排查实战

1. 每天敲的密码到底去了哪儿开机、解锁、连公司共享盘、远程桌面连服务器,Windows 弹出一个框让你输账号密码,这个动作一天少说重复三五次。绝大多数人把它当成呼吸一样自然,输完回车,进去了,完事。但如果你稍微停一下…

2026/10/10 10:39:50 阅读更多 →
OpenClaw 3.7 ContextEngine:让AI Agent上下文管理告别硬编码

OpenClaw 3.7 ContextEngine:让AI Agent上下文管理告别硬编码

OpenClaw 3.7 发布时,最让我在意的不是又接入了多少新模型,而是 ContextEngine 这个模块把 AI Agent 的上下文管理从主流程里彻底拆了出来。在 3.6 甚至更早的版本里,上下文拼装逻辑普遍直接写在 agent 主循环里:用户消息、系统提…

2026/10/10 10:39:50 阅读更多 →
TestGPT使用指南:AI辅助测试用例生成与接口测试提效实践

TestGPT使用指南:AI辅助测试用例生成与接口测试提效实践

看到“TestGPT使用指南”这个标题,我第一反应是:这大概又是一篇讲“如何用ChatGPT写测试用例”的文章。但实际搞过测试提效的人都知道,把GPT接到测试流程里,远不是打开对话框问一句“帮我测一下登录功能”那么简单。TestGPT并不是…

2026/10/10 10:39:50 阅读更多 →
OpenStack Nova深度拆解:架构、调度与故障排查实战

OpenStack Nova深度拆解:架构、调度与故障排查实战

做OpenStack运维的,不管你是从哪个版本入手的,肯定绕不过Nova这个组件。我之前跟人聊架构的时候经常发现一个现象:很多人用一行命令装完一套环境,能建虚机能删虚机,但真到了排查“虚机一直BUILD”、“迁移失败”、“调…

2026/10/10 10:39:50 阅读更多 →
Claude Code v2.1.157 发布日报:插件去中心化 + Agent 调度增强 + Worktree 跨会话切换|TaoToken 统一 Key 接入实测

Claude Code v2.1.157 发布日报:插件去中心化 + Agent 调度增强 + Worktree 跨会话切换|TaoToken 统一 Key 接入实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:46 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →