1. 并发扣库存:先锁后查
坑:先查询库存再判断,超卖事故。
解法:UPDATE ... SET stock = stock - 1 WHERE stock > 0,用原子操作 + 影响行数判断。
2. 慢查询:索引失效的常见原因
坑:LIKE '%keyword%' 前缀模糊导致全表扫描。
解法:业务上改为前缀匹配,或引入 ES;必要时用覆盖索引。
3. 时区问题:永远存 UTC
坑:直接存东八区字符串,跨平台解析乱套。 解法:数据库统一 UTC,展示层再转本地时区。
4. 上传文件:务必做类型校验
坑:只看扩展名放行,被上传了 web shell。 解法:校验 MIME + 魔数 + 重命名存储 + 独立静态域。
5. 配置管理:敏感信息不进代码仓库
坑:数据库密码写死在代码里,仓库泄露全完。 解法:环境变量 + 密钥管理服务,.env 不进 git。
6. 定时任务:防重复执行
坑:多实例部署后定时任务重复跑,产生重复数据。 解法:分布式锁(Redis SETNX + 过期时间)。
7. 第三方接口:必须做超时与重试
坑:调用支付接口不设超时,接口挂了页面一直转圈。 解法:统一 HTTP 客户端,设置连接/读取超时 + 幂等重试。
8. 日志:关键节点必须留痕
坑:线上出问题查不到上下文,只能靠猜。 解法:请求 ID 贯穿全链路,关键操作打印结构化日志。
9. 数据库连接池:用完必还
坑:连接未释放,连接池耗尽服务假死。 解法:使用 ORM/连接池管理,禁止手写裸连接不关闭。
10. 备份:先演练恢复
坑:有备份但从没演练过,真出事时恢复失败。 解法:定期做恢复演练,备份文件异地存储。
写在最后
这 10 条几乎都是"看起来很简单,出事很严重"的典型。小项目更要注重基本功,把这些变成肌肉记忆。