分布式锁Redisson实战,解决订单超卖并发问题

发布时间:2026/10/11 6:03:51

分布式锁Redisson实战,解决订单超卖并发问题 做电商后端开发商品超卖应该算是老生常谈的并发难题了。之前我参与过一个秒杀小活动库存设置 100 件最后下单成功 130 多单直接出现超卖后续还要人工处理退款给业务造成不小麻烦。一开始我们用数据库乐观锁去处理并发量不高的时候还好一旦请求量上来大量请求直接打在数据库数据库 CPU 飙升接口响应直接超时。后来调研选型最终采用 Redisson 分布式锁来解决该问题。今天结合线上踩过的坑把 Redisson 分布式锁落地完整过程记录下来。一、为什么不能直接用原生 Redis 实现分布式锁很多同学刚开始会直接用SETNX手写 Redis 锁。写起来看着简单但是坑非常多。比如锁超时、业务还没执行完锁就释放锁被其他线程误释放主从切换锁丢失等一堆问题。如果自己全部去处理这些边界代码会写的非常复杂稍有遗漏就会出线上故障。而 Redisson 是 Redis 官方推荐的 Java 客户端它把锁续期、锁可重入、锁释放、主从等各种复杂逻辑全部封装好了我们直接调用 API 即可生产环境稳定性要高很多。二、项目引入 Redisson 依赖SpringBoot 项目pom.xml 引入依赖注意版本要和你的 SpringBoot 版本兼容。dependency groupIdorg.redisson/groupId artifactIdredisson‑spring‑boot‑starter/artifactId version3.23.5/version /dependencyapplication.yml 配置 Redis 连接信息spring: redis: host: 127.0.0.1 port: 6379 password: database: 0三、订单扣库存超卖错误示例问题代码先看一段有并发问题的代码这也是很多新手容易写出的业务逻辑。Service public class OrderServiceImpl implements OrderService { Autowired private GoodsMapper goodsMapper; Autowired private OrderMapper orderMapper; Override Transactional public void createOrder(Long goodsId) { //1.查询库存 Goods goods goodsMapper.selectById(goodsId); if(goods.getStock() 0){ throw new RuntimeException(商品库存不足); } //2.扣减库存 goods.setStock(goods.getStock() -1); goodsMapper.updateById(goods); //3.生成订单 Order order new Order(); order.setGoodsId(goodsId); orderMapper.insert(order); } }问题高并发场景多个线程同时读到同一个库存数值全部通过库存判断就会产生超卖。单纯数据库事务解决不了这个问题事务只能保证原子性不能挡住并发读取。四、Redisson 分布式锁改造后的业务代码这里使用 Redisson 可重入锁RLock直接上锁之后再执行库存判断和下单逻辑。Service public class OrderServiceImpl implements OrderService { Autowired private GoodsMapper goodsMapper; Autowired private OrderMapper orderMapper; Autowired private RedissonClient redissonClient; Override Transactional public void createOrder(Long goodsId) { //定义锁key同一个商品用同一个key String lockKey lock:goods: goodsId; RLock rLock redissonClient.getLock(lockKey); try { //尝试获取锁等待3秒锁自动释放时间30秒 boolean getLock rLock.tryLock(3,30, TimeUnit.SECONDS); if(!getLock){ throw new RuntimeException(请求繁忙请稍后重试); } //获取锁成功执行业务 Goods goods goodsMapper.selectById(goodsId); if(goods.getStock() 0){ throw new RuntimeException(商品库存不足); } goods.setStock(goods.getStock() -1); goodsMapper.updateById(goods); Order order new Order(); order.setGoodsId(goodsId); orderMapper.insert(order); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new RuntimeException(获取锁异常); } finally { //必须判断当前线程持有锁才释放防止误释放别人的锁 if(rLock.isHeldByCurrentThread()){ rLock.unlock(); } } } }这里有个细节finally释放锁的时候一定要判断isHeldByCurrentThread()。如果业务执行异常锁已经过期释放直接调用 unlock会把其他线程拿到的锁给释放掉这个坑不少人踩过。Redisson 自带的看门狗机制如果业务执行时间超过设置的 30 秒会自动给锁续期避免业务没跑完锁提前释放这也是手写 SETNX 锁很难实现的能力。五、实际生产落地需要注意的几个坑锁粒度不要太大不要直接写一个全局锁所有商品共用同一个 key。不同商品使用不同的 lockKey例如lock:goods:{goodsId}并发性能会高很多。分布式锁不能完全替代数据库层面防护分布式锁也不是万无一失。Redis 主从切换锁有可能丢失。建议数据库层面加上库存版本号乐观锁作为兜底双重防护杜绝超卖。简单乐观锁更新示例update goods set stock stock‑1, version version1 where id #{goodsId} and stock0 and version #{version};锁和事务顺序问题锁要加在事务外面。如果锁在事务内部事务还没提交完成锁就释放其他线程读到未提交的数据依旧会出现并发问题。区分锁类型普通抢购场景用可重入锁 RLock读写场景可以考虑 Redisson 读写锁如果是集群环境要配置 Redisson 的 Redis 集群模式不要单机配置。六、总结超卖问题本质就是并发下共享资源竞争。数据库乐观锁适合并发压力一般的场景当 QPS 较高大量请求冲击数据库就需要引入分布式锁。Redisson 把分布式锁里面各种棘手问题锁续期、可重入、防止误释放、异常处理全部封装好了开发不用重复造轮子。但千万不要觉得上了分布式锁就万事大吉。Redis 毕竟是中间件存在网络、主从切换等不可控因素。生产环境建议Redisson 分布式锁 数据库乐观锁双重兜底最大程度避免超卖事故。实际项目里面还可以继续优化结合 MQ 异步削峰把下单逻辑异步化进一步提升系统承载能力。Csdn.otftcf.cN/Article/details/23979.sHtMLCsdn.otftcf.cN/Article/details/01851.sHtMLCsdn.otftcf.cN/Article/details/86259.sHtMLCsdn.otftcf.cN/Article/details/45039.sHtMLCsdn.otftcf.cN/Article/details/03930.sHtMLCsdn.otftcf.cN/Article/details/96005.sHtMLCsdn.otftcf.cN/Article/details/09542.sHtMLCsdn.otftcf.cN/Article/details/03508.sHtMLCsdn.otftcf.cN/Article/details/68259.sHtMLCsdn.otftcf.cN/Article/details/41700.sHtMLCsdn.otftcf.cN/Article/details/43631.sHtMLCsdn.otftcf.cN/Article/details/26368.sHtMLCsdn.otftcf.cN/Article/details/53243.sHtMLCsdn.otftcf.cN/Article/details/29143.sHtMLCsdn.otftcf.cN/Article/details/52681.sHtMLCsdn.otftcf.cN/Article/details/37799.sHtMLCsdn.otftcf.cN/Article/details/32842.sHtMLCsdn.otftcf.cN/Article/details/46487.sHtMLCsdn.otftcf.cN/Article/details/31573.sHtMLCsdn.otftcf.cN/Article/details/26301.sHtMLCsdn.otftcf.cN/Article/details/33388.sHtMLCsdn.otftcf.cN/Article/details/98462.sHtMLCsdn.otftcf.cN/Article/details/14709.sHtMLCsdn.otftcf.cN/Article/details/31135.sHtMLCsdn.otftcf.cN/Article/details/09590.sHtMLCsdn.otftcf.cN/Article/details/28372.sHtMLCsdn.otftcf.cN/Article/details/08326.sHtMLCsdn.otftcf.cN/Article/details/29296.sHtMLCsdn.otftcf.cN/Article/details/47713.sHtMLCsdn.otftcf.cN/Article/details/92396.sHtMLCsdn.otftcf.cN/Article/details/86993.sHtMLCsdn.otftcf.cN/Article/details/22430.sHtMLCsdn.otftcf.cN/Article/details/49670.sHtMLCsdn.otftcf.cN/Article/details/80132.sHtMLCsdn.otftcf.cN/Article/details/70169.sHtMLCsdn.otftcf.cN/Article/details/42557.sHtMLCsdn.otftcf.cN/Article/details/26626.sHtMLCsdn.otftcf.cN/Article/details/62196.sHtMLCsdn.otftcf.cN/Article/details/64315.sHtMLCsdn.otftcf.cN/Article/details/12170.sHtMLCsdn.otftcf.cN/Article/details/16667.sHtMLCsdn.otftcf.cN/Article/details/52431.sHtMLCsdn.otftcf.cN/Article/details/73167.sHtMLCsdn.otftcf.cN/Article/details/44001.sHtMLCsdn.otftcf.cN/Article/details/32053.sHtMLCsdn.otftcf.cN/Article/details/87683.sHtMLCsdn.otftcf.cN/Article/details/96883.sHtMLCsdn.otftcf.cN/Article/details/78010.sHtMLCsdn.otftcf.cN/Article/details/77173.sHtMLCsdn.otftcf.cN/Article/details/81350.sHtMLCsdn.otftcf.cN/Article/details/91726.sHtMLCsdn.otftcf.cN/Article/details/10117.sHtMLCsdn.otftcf.cN/Article/details/49112.sHtMLCsdn.otftcf.cN/Article/details/73668.sHtMLCsdn.otftcf.cN/Article/details/35555.sHtMLCsdn.otftcf.cN/Article/details/84266.sHtMLCsdn.otftcf.cN/Article/details/18159.sHtMLCsdn.otftcf.cN/Article/details/53697.sHtMLCsdn.otftcf.cN/Article/details/41263.sHtMLCsdn.otftcf.cN/Article/details/02516.sHtMLCsdn.otftcf.cN/Article/details/81008.sHtMLCsdn.otftcf.cN/Article/details/31484.sHtMLCsdn.otftcf.cN/Article/details/80416.sHtMLCsdn.otftcf.cN/Article/details/48781.sHtMLCsdn.otftcf.cN/Article/details/54090.sHtMLCsdn.otftcf.cN/Article/details/07634.sHtMLCsdn.otftcf.cN/Article/details/02660.sHtMLCsdn.otftcf.cN/Article/details/45964.sHtMLCsdn.otftcf.cN/Article/details/72954.sHtMLCsdn.otftcf.cN/Article/details/49932.sHtMLCsdn.otftcf.cN/Article/details/38109.sHtMLCsdn.otftcf.cN/Article/details/34930.sHtMLCsdn.otftcf.cN/Article/details/16979.sHtMLCsdn.otftcf.cN/Article/details/08181.sHtMLCsdn.otftcf.cN/Article/details/81858.sHtMLCsdn.otftcf.cN/Article/details/10695.sHtMLCsdn.otftcf.cN/Article/details/04382.sHtMLCsdn.otftcf.cN/Article/details/68399.sHtMLCsdn.otftcf.cN/Article/details/03077.sHtMLCsdn.otftcf.cN/Article/details/87942.sHtMLCsdn.otftcf.cN/Article/details/48596.sHtMLCsdn.otftcf.cN/Article/details/35596.sHtMLCsdn.otftcf.cN/Article/details/87671.sHtMLCsdn.otftcf.cN/Article/details/32704.sHtMLCsdn.otftcf.cN/Article/details/56154.sHtMLCsdn.otftcf.cN/Article/details/64787.sHtMLCsdn.otftcf.cN/Article/details/80695.sHtMLCsdn.otftcf.cN/Article/details/66814.sHtMLCsdn.otftcf.cN/Article/details/96017.sHtMLCsdn.otftcf.cN/Article/details/97934.sHtMLCsdn.otftcf.cN/Article/details/40554.sHtMLCsdn.otftcf.cN/Article/details/13217.sHtMLCsdn.otftcf.cN/Article/details/39354.sHtMLCsdn.otftcf.cN/Article/details/05694.sHtMLCsdn.otftcf.cN/Article/details/54209.sHtMLCsdn.otftcf.cN/Article/details/97485.sHtMLCsdn.otftcf.cN/Article/details/27044.sHtMLCsdn.otftcf.cN/Article/details/78947.sHtMLCsdn.otftcf.cN/Article/details/31397.sHtMLCsdn.otftcf.cN/Article/details/51508.sHtMLCsdn.otftcf.cN/Article/details/95487.sHtMLCsdn.otftcf.cN/Article/details/52507.sHtMLCsdn.otftcf.cN/Article/details/17509.sHtMLCsdn.otftcf.cN/Article/details/55825.sHtMLCsdn.otftcf.cN/Article/details/72473.sHtMLCsdn.otftcf.cN/Article/details/01597.sHtMLCsdn.otftcf.cN/Article/details/21816.sHtMLCsdn.otftcf.cN/Article/details/96053.sHtMLCsdn.otftcf.cN/Article/details/80368.sHtMLCsdn.otftcf.cN/Article/details/40856.sHtMLCsdn.otftcf.cN/Article/details/96896.sHtMLCsdn.otftcf.cN/Article/details/89327.sHtMLCsdn.otftcf.cN/Article/details/71057.sHtMLCsdn.otftcf.cN/Article/details/49181.sHtMLCsdn.otftcf.cN/Article/details/10540.sHtMLCsdn.otftcf.cN/Article/details/94310.sHtMLCsdn.otftcf.cN/Article/details/19718.sHtMLCsdn.otftcf.cN/Article/details/48328.sHtMLCsdn.otftcf.cN/Article/details/52948.sHtMLCsdn.otftcf.cN/Article/details/17849.sHtMLCsdn.otftcf.cN/Article/details/87762.sHtMLCsdn.otftcf.cN/Article/details/67646.sHtMLCsdn.otftcf.cN/Article/details/12087.sHtMLCsdn.otftcf.cN/Article/details/45653.sHtMLCsdn.otftcf.cN/Article/details/50463.sHtMLCsdn.otftcf.cN/Article/details/72458.sHtMLCsdn.otftcf.cN/Article/details/23479.sHtMLCsdn.otftcf.cN/Article/details/28745.sHtMLCsdn.otftcf.cN/Article/details/23736.sHtMLCsdn.otftcf.cN/Article/details/13037.sHtMLCsdn.otftcf.cN/Article/details/07815.sHtMLCsdn.otftcf.cN/Article/details/16100.sHtMLCsdn.otftcf.cN/Article/details/11657.sHtMLCsdn.otftcf.cN/Article/details/59554.sHtMLCsdn.otftcf.cN/Article/details/75620.sHtMLCsdn.otftcf.cN/Article/details/98442.sHtMLCsdn.otftcf.cN/Article/details/72996.sHtMLCsdn.otftcf.cN/Article/details/54153.sHtMLCsdn.otftcf.cN/Article/details/05563.sHtMLCsdn.otftcf.cN/Article/details/32834.sHtMLCsdn.otftcf.cN/Article/details/06743.sHtMLCsdn.otftcf.cN/Article/details/50318.sHtMLCsdn.otftcf.cN/Article/details/39199.sHtMLCsdn.otftcf.cN/Article/details/06334.sHtMLCsdn.otftcf.cN/Article/details/70916.sHtMLCsdn.otftcf.cN/Article/details/01456.sHtMLCsdn.otftcf.cN/Article/details/22133.sHtMLCsdn.otftcf.cN/Article/details/21355.sHtMLCsdn.otftcf.cN/Article/details/65337.sHtMLCsdn.otftcf.cN/Article/details/08874.sHtMLCsdn.otftcf.cN/Article/details/15346.sHtMLCsdn.otftcf.cN/Article/details/61001.sHtMLCsdn.otftcf.cN/Article/details/83231.sHtMLCsdn.otftcf.cN/Article/details/35410.sHtMLCsdn.otftcf.cN/Article/details/38547.sHtMLCsdn.otftcf.cN/Article/details/13730.sHtMLCsdn.otftcf.cN/Article/details/18038.sHtMLCsdn.otftcf.cN/Article/details/07964.sHtMLCsdn.otftcf.cN/Article/details/68073.sHtMLCsdn.otftcf.cN/Article/details/97380.sHtMLCsdn.otftcf.cN/Article/details/10373.sHtMLCsdn.otftcf.cN/Article/details/07387.sHtMLCsdn.otftcf.cN/Article/details/11740.sHtMLCsdn.otftcf.cN/Article/details/44462.sHtMLCsdn.otftcf.cN/Article/details/17056.sHtMLCsdn.otftcf.cN/Article/details/99535.sHtMLCsdn.otftcf.cN/Article/details/38460.sHtMLCsdn.otftcf.cN/Article/details/69853.sHtMLCsdn.otftcf.cN/Article/details/95709.sHtMLCsdn.otftcf.cN/Article/details/62756.sHtMLCsdn.otftcf.cN/Article/details/69651.sHtMLCsdn.otftcf.cN/Article/details/45152.sHtMLCsdn.otftcf.cN/Article/details/88076.sHtMLCsdn.otftcf.cN/Article/details/08307.sHtMLCsdn.otftcf.cN/Article/details/28729.sHtMLCsdn.otftcf.cN/Article/details/31845.sHtMLCsdn.otftcf.cN/Article/details/82680.sHtMLCsdn.otftcf.cN/Article/details/85639.sHtMLCsdn.otftcf.cN/Article/details/20795.sHtMLCsdn.otftcf.cN/Article/details/60202.sHtMLCsdn.otftcf.cN/Article/details/32287.sHtMLCsdn.otftcf.cN/Article/details/27956.sHtMLCsdn.otftcf.cN/Article/details/43084.sHtMLCsdn.otftcf.cN/Article/details/17386.sHtMLCsdn.otftcf.cN/Article/details/24710.sHtMLCsdn.otftcf.cN/Article/details/07056.sHtMLCsdn.otftcf.cN/Article/details/41540.sHtMLCsdn.otftcf.cN/Article/details/47551.sHtMLCsdn.otftcf.cN/Article/details/14605.sHtMLCsdn.otftcf.cN/Article/details/02323.sHtMLCsdn.otftcf.cN/Article/details/68584.sHtMLCsdn.otftcf.cN/Article/details/19625.sHtMLCsdn.otftcf.cN/Article/details/92536.sHtMLCsdn.otftcf.cN/Article/details/40090.sHtMLCsdn.otftcf.cN/Article/details/06626.sHtMLCsdn.otftcf.cN/Article/details/86829.sHtMLCsdn.otftcf.cN/Article/details/95896.sHtMLCsdn.otftcf.cN/Article/details/21481.sHtMLCsdn.otftcf.cN/Article/details/79061.sHtMLCsdn.otftcf.cN/Article/details/87142.sHtMLCsdn.otftcf.cN/Article/details/49016.sHtMLCsdn.otftcf.cN/Article/details/88651.sHtMLCsdn.otftcf.cN/Article/details/44621.sHtMLCsdn.otftcf.cN/Article/details/61641.sHtMLCsdn.otftcf.cN/Article/details/81629.sHtMLCsdn.otftcf.cN/Article/details/28469.sHtMLCsdn.otftcf.cN/Article/details/08291.sHtMLCsdn.otftcf.cN/Article/details/83635.sHtMLCsdn.otftcf.cN/Article/details/16256.sHtMLCsdn.otftcf.cN/Article/details/05819.sHtMLCsdn.otftcf.cN/Article/details/34924.sHtMLCsdn.otftcf.cN/Article/details/70613.sHtMLCsdn.otftcf.cN/Article/details/03429.sHtMLCsdn.otftcf.cN/Article/details/14900.sHtMLCsdn.otftcf.cN/Article/details/56319.sHtMLCsdn.otftcf.cN/Article/details/42601.sHtMLCsdn.otftcf.cN/Article/details/97066.sHtMLCsdn.otftcf.cN/Article/details/78208.sHtMLCsdn.otftcf.cN/Article/details/46005.sHtMLCsdn.otftcf.cN/Article/details/13604.sHtMLCsdn.otftcf.cN/Article/details/25692.sHtMLCsdn.otftcf.cN/Article/details/01682.sHtMLCsdn.otftcf.cN/Article/details/71608.sHtMLCsdn.otftcf.cN/Article/details/62713.sHtMLCsdn.otftcf.cN/Article/details/96572.sHtMLCsdn.otftcf.cN/Article/details/68100.sHtMLCsdn.otftcf.cN/Article/details/24930.sHtMLCsdn.otftcf.cN/Article/details/71285.sHtMLCsdn.otftcf.cN/Article/details/45304.sHtMLCsdn.otftcf.cN/Article/details/47398.sHtMLCsdn.otftcf.cN/Article/details/98880.sHtMLCsdn.otftcf.cN/Article/details/04272.sHtMLCsdn.otftcf.cN/Article/details/40180.sHtMLCsdn.otftcf.cN/Article/details/92898.sHtMLCsdn.otftcf.cN/Article/details/22485.sHtMLCsdn.otftcf.cN/Article/details/15623.sHtMLCsdn.otftcf.cN/Article/details/00005.sHtMLCsdn.otftcf.cN/Article/details/93926.sHtMLCsdn.otftcf.cN/Article/details/40654.sHtMLCsdn.otftcf.cN/Article/details/25135.sHtMLCsdn.otftcf.cN/Article/details/22546.sHtMLCsdn.otftcf.cN/Article/details/55708.sHtMLCsdn.otftcf.cN/Article/details/20531.sHtMLCsdn.otftcf.cN/Article/details/20212.sHtMLCsdn.otftcf.cN/Article/details/01523.sHtMLCsdn.otftcf.cN/Article/details/92810.sHtMLCsdn.otftcf.cN/Article/details/95947.sHtMLCsdn.otftcf.cN/Article/details/36445.sHtMLCsdn.otftcf.cN/Article/details/42454.sHtMLCsdn.otftcf.cN/Article/details/70617.sHtMLCsdn.otftcf.cN/Article/details/14485.sHtMLCsdn.otftcf.cN/Article/details/85106.sHtMLCsdn.otftcf.cN/Article/details/64502.sHtMLCsdn.otftcf.cN/Article/details/89422.sHtMLCsdn.otftcf.cN/Article/details/15062.sHtMLCsdn.otftcf.cN/Article/details/88862.sHtMLCsdn.otftcf.cN/Article/details/22217.sHtMLCsdn.otftcf.cN/Article/details/36578.sHtMLCsdn.otftcf.cN/Article/details/27542.sHtMLCsdn.otftcf.cN/Article/details/52888.sHtMLCsdn.otftcf.cN/Article/details/81389.sHtMLCsdn.otftcf.cN/Article/details/06018.sHtMLCsdn.otftcf.cN/Article/details/17286.sHtMLCsdn.otftcf.cN/Article/details/46041.sHtMLCsdn.otftcf.cN/Article/details/58331.sHtMLCsdn.otftcf.cN/Article/details/43907.sHtMLCsdn.otftcf.cN/Article/details/24533.sHtMLCsdn.otftcf.cN/Article/details/71350.sHtMLCsdn.otftcf.cN/Article/details/16291.sHtMLCsdn.otftcf.cN/Article/details/87237.sHtMLCsdn.otftcf.cN/Article/details/70559.sHtMLCsdn.otftcf.cN/Article/details/08486.sHtMLCsdn.otftcf.cN/Article/details/57979.sHtMLCsdn.otftcf.cN/Article/details/86246.sHtMLCsdn.otftcf.cN/Article/details/83094.sHtMLCsdn.otftcf.cN/Article/details/51934.sHtMLCsdn.otftcf.cN/Article/details/28453.sHtMLCsdn.otftcf.cN/Article/details/63835.sHtMLCsdn.otftcf.cN/Article/details/39699.sHtMLCsdn.otftcf.cN/Article/details/72840.sHtMLCsdn.otftcf.cN/Article/details/03446.sHtMLCsdn.otftcf.cN/Article/details/61223.sHtMLCsdn.otftcf.cN/Article/details/83903.sHtMLCsdn.otftcf.cN/Article/details/61242.sHtMLCsdn.otftcf.cN/Article/details/60933.sHtMLCsdn.otftcf.cN/Article/details/11359.sHtMLCsdn.otftcf.cN/Article/details/94738.sHtMLCsdn.otftcf.cN/Article/details/27213.sHtMLCsdn.otftcf.cN/Article/details/63457.sHtMLCsdn.otftcf.cN/Article/details/06926.sHtMLCsdn.otftcf.cN/Article/details/73394.sHtMLCsdn.otftcf.cN/Article/details/31557.sHtMLCsdn.otftcf.cN/Article/details/26931.sHtMLCsdn.otftcf.cN/Article/details/10878.sHtMLCsdn.otftcf.cN/Article/details/38429.sHtMLCsdn.otftcf.cN/Article/details/33460.sHtMLCsdn.otftcf.cN/Article/details/97261.sHtMLCsdn.otftcf.cN/Article/details/78731.sHtMLCsdn.otftcf.cN/Article/details/24082.sHtMLCsdn.otftcf.cN/Article/details/82929.sHtMLCsdn.otftcf.cN/Article/details/84643.sHtMLCsdn.otftcf.cN/Article/details/67272.sHtMLCsdn.otftcf.cN/Article/details/24056.sHtMLCsdn.otftcf.cN/Article/details/47766.sHtMLCsdn.otftcf.cN/Article/details/10373.sHtMLCsdn.otftcf.cN/Article/details/26267.sHtMLCsdn.otftcf.cN/Article/details/72880.sHtMLCsdn.otftcf.cN/Article/details/00086.sHtMLCsdn.otftcf.cN/Article/details/32486.sHtMLCsdn.otftcf.cN/Article/details/23070.sHtMLCsdn.otftcf.cN/Article/details/98182.sHtMLCsdn.otftcf.cN/Article/details/15123.sHtMLCsdn.otftcf.cN/Article/details/02035.sHtMLCsdn.otftcf.cN/Article/details/13350.sHtMLCsdn.otftcf.cN/Article/details/02550.sHtMLCsdn.otftcf.cN/Article/details/35640.sHtMLCsdn.otftcf.cN/Article/details/78262.sHtMLCsdn.otftcf.cN/Article/details/20559.sHtMLCsdn.otftcf.cN/Article/details/11268.sHtMLCsdn.otftcf.cN/Article/details/01342.sHtMLCsdn.otftcf.cN/Article/details/64932.sHtMLCsdn.otftcf.cN/Article/details/48416.sHtMLCsdn.otftcf.cN/Article/details/52606.sHtMLCsdn.otftcf.cN/Article/details/83584.sHtMLCsdn.otftcf.cN/Article/details/20033.sHtMLCsdn.otftcf.cN/Article/details/78397.sHtMLCsdn.otftcf.cN/Article/details/26282.sHtMLCsdn.otftcf.cN/Article/details/40951.sHtMLCsdn.otftcf.cN/Article/details/72861.sHtMLCsdn.otftcf.cN/Article/details/21546.sHtMLCsdn.rsyais.cN/Article/details/80504.sHtMLCsdn.rsyais.cN/Article/details/83638.sHtMLCsdn.rsyais.cN/Article/details/74776.sHtMLCsdn.rsyais.cN/Article/details/33504.sHtMLCsdn.rsyais.cN/Article/details/07946.sHtMLCsdn.rsyais.cN/Article/details/72255.sHtMLCsdn.rsyais.cN/Article/details/71109.sHtMLCsdn.rsyais.cN/Article/details/36296.sHtMLCsdn.rsyais.cN/Article/details/66243.sHtMLCsdn.rsyais.cN/Article/details/16142.sHtMLCsdn.rsyais.cN/Article/details/48322.sHtMLCsdn.rsyais.cN/Article/details/54142.sHtMLCsdn.rsyais.cN/Article/details/47300.sHtMLCsdn.rsyais.cN/Article/details/63175.sHtMLCsdn.rsyais.cN/Article/details/89715.sHtMLCsdn.rsyais.cN/Article/details/50003.sHtMLCsdn.rsyais.cN/Article/details/87926.sHtMLCsdn.rsyais.cN/Article/details/96622.sHtMLCsdn.rsyais.cN/Article/details/94596.sHtMLCsdn.rsyais.cN/Article/details/85193.sHtMLCsdn.rsyais.cN/Article/details/70722.sHtMLCsdn.rsyais.cN/Article/details/13563.sHtMLCsdn.rsyais.cN/Article/details/93336.sHtMLCsdn.rsyais.cN/Article/details/93309.sHtMLCsdn.rsyais.cN/Article/details/86437.sHtMLCsdn.rsyais.cN/Article/details/96859.sHtMLCsdn.rsyais.cN/Article/details/60655.sHtMLCsdn.rsyais.cN/Article/details/73716.sHtMLCsdn.rsyais.cN/Article/details/80554.sHtMLCsdn.rsyais.cN/Article/details/68019.sHtMLCsdn.rsyais.cN/Article/details/57105.sHtMLCsdn.rsyais.cN/Article/details/91798.sHtMLCsdn.rsyais.cN/Article/details/32069.sHtMLCsdn.rsyais.cN/Article/details/75585.sHtMLCsdn.rsyais.cN/Article/details/04547.sHtMLCsdn.rsyais.cN/Article/details/83270.sHtMLCsdn.rsyais.cN/Article/details/77032.sHtMLCsdn.rsyais.cN/Article/details/87622.sHtMLCsdn.rsyais.cN/Article/details/64620.sHtML
延伸阅读

更多相关文章

2026/10/8 3:01:32

新手必看!避开90%人踩过的for循环陷阱

一、90% 新手都踩过的坑,你可能也在其中 从事数据处理、脚本开发工作的人, 差不多都经历过这般崩溃之时: 满心欢喜地去加载相关数据集, 精心写好 for 循环语句之后, 点击运行按钮, 然而脚本却长时间毫无反应, 电脑运行得愈发卡顿, 直至最后直接死机——并非代码编写…

2026/10/6 21:37:31

192、飞控中的无人机集群:法规与伦理考量

飞控算法从入门到精通 192 飞控中的无人机集群:法规与伦理考量 一、从一次“炸机”说起 去年夏天,我在某园区做多机协同编队测试。六架四旋翼按预设的“蜂群”队形起飞,前五分钟一切正常——直到第三架飞机突然偏离航线,径直撞向旁边一栋楼的玻璃幕墙。事后分析日志,发…

2026/10/11 6:02:45

基于遗传算法的配电网故障重构:MATLAB实现与参数调优

1. 配电网故障重构是怎么变成优化问题的大部分做配电网的人第一次接触“重构”这个概念时都会有个疑问:不就是把开关合上、断开,把电送回来吗?这也能写出个优化算法来?说实话,一开始我也是这么想的,直到自己…

2026/10/11 6:02:45

2026最新网页版百度网盘直链解析教程:不装客户端实现高速下载

现代生活中文件往来变得越来越频繁,无论是工作中的设计稿件还是生活里的高清视频,网络云盘都成为了不可或缺的工具。然而不少人在下载时经常发现速度忽高忽低甚至直接掉到极低的水平,这常常会严重打乱大家的工作和生活节奏。 其实许多人在排…

2026/10/11 6:02:45

Safety Layer学习

继续。既然 ROS2 系统能力主线已经完成,现在不再新增一堆零散知识,而是进入你前面说的 “整合阶段”。这一阶段目标只有一个:把你已经学过的 C、Linux、实时控制、ROS2、Safety,真正拼成一个机器人软件系统。第17课:机…

2026/10/11 5:57:44

AI智能体实战:从写代码到设计环境,提升开发效率

1. 从“写代码”到“设计环境”:一个正在发生的范式转移如果你最近半年一直在关注 AI 辅助开发这个方向,应该能明显感觉到一个变化:讨论的重心正在从“哪个补全工具更准”悄悄转向“怎么给智能体搭一个它能自己跑起来的环境”。这个转变不是营…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑