测试工程师数据库操作实战指南:从SELECT到事务与性能排查
作为测试工程师你日常的工作流里有一个绕不开的坎不管是功能测试、接口测试还是自动化脚本跑完用例之后总要回到数据库里查一笔数据、改一个状态、造一条测试记录。我见过太多测试同行的日常状态是——业务逻辑和用例设计都很熟练但一到数据库环节就开始四处求人帮我看下这条数据怎么查不出来这个SQL写错了哪里测试环境的数据又被搞脏了谁帮忙清一下。说实话数据库操作命令对测试工程师来说不是那种会用就行的锦上添花而是直接影响你工作效率的基础功。你不需要达到DBA那种能调参优化集群的水平但你必须能独立完成数据准备、结果校验、异常数据清理这些高频操作。这篇文章我打算把我自己这些年实测下来最常用的数据库命令、场景化操作方法和踩坑经验做一个系统性的梳理从最简单的SELECT到事务处理、性能分析都有覆盖适合各个阶段的测试工程师对照着用。1. 测试工程师为什么必须掌握数据库操作1.1 测试工作与数据操作的交集在哪里先说一个很现实的问题测试工程师每天都在跟数据库打交道但很多人没意识到这一点。功能测试里你要验证提交订单后库存表数量是否减一这需要查数据库接口测试里一个创建用户的接口跑完你要确认user表里真的多了一条记录这也需要查数据库自动化测试中你要先往数据库里插入一批符合条件的数据作为前置准备测试结束后还要把这些数据清理掉避免影响下一轮测试。我以前带过一个刚入行的同事他测一个用户注销的功能界面上提示注销成功他就把这个用例标记为通过了。我问他你怎么确认数据库里的用户状态真的变成已注销了他愣住了。后来我带他写了一条简单的SELECT语句查用户表的状态字段结果发现实际状态还是正常——原来那个功能的前端校验有Bug接口压根没调成功。这个例子很典型不做数据库校验很多看起来通过的用例实际上是在掩耳盗铃。1.2 测试场景中高频率使用的数据库操作类型从我个人的实践经验看测试工程师使用数据库的场景高度集中在四类操作上。第一类是查询验证占比最高几乎所有测试用例都离不开用SELECT语句核对接口或页面操作后的数据结果。第二类是数据准备比如测试下单流程你得先准备一个库存充足的商品、一个余额足够的账号这些前置数据往往需要直接用INSERT语句造出来。第三类是数据清理一轮测试跑完脏数据、关联数据、中间表残留都需要你清理还原避免污染下一轮测试DELETE和TRUNCATE在这里高频出现。第四类是数据修改某些场景下你需要绕过业务逻辑、直接改一条记录的字段来模拟特定状态比如把订单状态从待支付改为已支付以便测试后续流程这种操作需要UPDATE语句来实现。了解这些场景之后你会发现测试工程师对数据库命令的掌握程度直接决定了你的测试效率和质量。如果只会百度一个SQL然后复制粘贴你永远要比别人多花几倍的时间在处理数据和验证结果上。2. 最核心的查询命令SELECT的实战级用法2.1 SELECT基础语法与经验习惯查询是测试工程师使用频率最高的数据库操作没有之一。SELECT语句的基本语法很简单SELECT 字段列表 FROM 表名 WHERE 条件。但我见过很多人在这一步就养成了坏习惯——动不动就SELECT *。我在实际工作中强烈建议你养成显式列出所需字段的习惯原因有两个第一生产环境的表字段可能非常多全字段查询会拉取大量不必要的数据影响查询效率第二字段过多会把结果集刷屏你反而看不清自己关心的字段值。比如你要查订单表里某条记录的支付状态就写SELECT order_id, pay_status, amount FROM orders WHERE order_id 12345既清晰又高效。新手最容易忽略的一个细节是MySQL默认对字符串比较不区分大小写所以WHERE user_name admin和WHERE user_name ADMIN查出的结果是一样的。但如果某个表的字段设置了BINARY属性或使用utf8mb4_bin排序规则大小写就是敏感的。你在测试排查问题时如果发现明明有这条数据但查不出来先看一眼排序规则这类问题很坑人。2.2 WHERE条件过滤从基础到进阶WHERE子句是查询的过滤核心。常见操作符包括、!、、、、、BETWEEN、LIKE、IN和IS NULL。测试场景中有一个高频需求按时间范围查数据。比如我要验证过去24小时内的所有登录日志SQL可以写成SELECT user_id, login_time FROM login_log WHERE login_time DATE_SUB(NOW(), INTERVAL 1 DAY) ORDER BY login_time DESC;这里有个实操经验值得说一下判断字段是否为NULL必须用IS NULL或IS NOT NULL不能写 NULL。 NULL永远返回空结果这是SQL的规范设计不是Bug。我每次带新人都会专门强调这个点因为在排查为什么数据查不出来时WHERE status NULL这种写法出现的频率实在太高了。另外测试场景中还经常会用到LIKE做模糊匹配。需要注意LIKE %关键字%这种写法无法利用索引数据量大时查询会很慢。如果只是验证某条数据是否存在我更建议用精确匹配加LIMIT 1或者用EXISTS子查询效率会高很多。2.3 分组统计与结果排序数据校验的关键步骤测试中经常要验证数量对不对。比如注册功能测试完你要确认今天新增了多少用户下单功能测试完你要确认订单总数和总金额是否正确。这类需求离不开GROUP BY和聚合函数。我举一个实际场景测试一个促销活动活动规则是每个用户最多只能参与3次你要验证系统是否真的限制了同一用户参与次数。可以用一条分组统计SQL快速核对SELECT user_id, COUNT(*) AS participate_count FROM activity_participation GROUP BY user_id HAVING COUNT(*) 3;这条SQL会把参与次数超过3条的用户全查出来如果有结果说明系统限制逻辑存在问题。这里的HAVING是在分组后做条件过滤而WHERE是在分组前过滤两者区别必须搞清楚。WHERE无法使用聚合函数作为条件这就是为什么需要HAVING存在的原因。排序方面ORDER BY支持多字段排序比如ORDER BY create_time DESC, id ASC的意思是先按创建时间倒序时间相同再按ID正序。测试中你要确认最新一条数据时最普遍的做法是ORDER BY id DESC LIMIT 1配合自增主键非常稳健。2.4 分页查询LIMIT的正确打开方式分页查询在接口测试和页面测试里出现频率很高。MySQL中用LIMIT实现分页有两种常见写法LIMIT 10表示只返回前10条LIMIT 10, 20表示从第11条开始返回20条。另一个容易混淆的写法是LIMIT 20 OFFSET 10它和LIMIT 10, 20的含义是一样的。这个顺序问题我建议你记住一个口诀写在前面的是偏移量写在后面的是返回条数。分页查询有一个典型的测试场景验证列表接口的分页参数是否正确。比如前端传page2size10你要去数据库里数一下总共多少条数据然后手动算出第二页应该展示哪些数据再和接口返回对比。这种校验光靠肉眼一条条看是低效的直接用SELECT ... LIMIT 10 OFFSET 10查出第二页数据然后和接口返回做比对效率会高很多。3. 数据准备与清理INSERT、UPDATE、DELETE的测试应用3.1 INSERT造测试数据的正确姿势测试执行前准备数据是高频场景INSERT命令几乎每天都要用。基本语法是INSERT INTO 表名 (字段1, 字段2) VALUES (值1, 值2)。但实际测试中造数据的方式远不止这一种。最基础的表结构是用户表、订单表、商品表之间存在外键关联。你不可能只往一张表里插入数据就能完事需要同时维护多张关联表的数据一致性。比如测试下单流程你需要先有用户、有商品、有库存记录如果直接INSERT一张空订单表业务流程走不通。这时候我通常会写一个SQL脚本按依赖顺序依次插入多张表的数据并且在一个事务里执行保证要么全部成功、要么全部回滚。还有一种非常实用的写法是复制表数据来造数据INSERT INTO target_table (col1, col2) SELECT col1, col2 FROM source_table WHERE ...。比如我想给某个用户多造10个已完成订单可以直接从已有的相似订单里复制这样数据更接近真实比手工一个个INSERT效率高得多。3.2 UPDATE场景模拟和状态切换的利器UPDATE语句在测试中的应用非常巧妙。比如你要测试订单列表页在订单处于不同状态下的展示是否符合预期你没有耐心一个个通过业务操作去触发状态流转那就可以直接改数据库。这属于典型的测试后门操作合法且高效。UPDATE orders SET order_status PAID, pay_time NOW() WHERE order_id 20240101001;这种操作的性价比非常高几分钟内你就能把一条订单从待支付改到已支付再改到已发货完整覆盖各种状态下的页面展示和逻辑分支。但需要注意直接改数据库绕过了业务逻辑校验改出来的数据可能与正常业务流转产生的数据存在细微差异。所以这种操作适合功能验证不适合做严格的接口数据一致性测试。我踩过的一个大坑是UPDATE语句忘了加WHERE条件结果把整张表的数据全部更新了。这事在测试环境还好说恢复一下就行但如果在生产环境后果不堪设想。所以我给自己定了一个铁律写UPDATE和DELETE语句时先写WHERE条件再回来写UPDATE或DELETE后面的部分。同时养成写完SQL先执行SELECT验证影响范围的习惯。3.3 DELETE与TRUNCATE数据清理的学问测试结束后的数据清理是很多人忽略但必须重视的环节。DELETE和TRUNCATE都能删除数据但区别很大。DELETE是逐条删除支持WHERE条件删除过程记录日志可以配合事务回滚TRUNCATE是直接清空整张表速度快但不可回滚也不能加WHERE条件。我建议的清理策略是只清理你这次测试造出来的数据用DELETE加精确的筛选条件比如按测试标识、特定时间段或特定的测试账号前缀来删。TRUNCATE这种全表清空操作只适合用在完全独立的临时表上。我曾经见过一个测试为了省事直接TRUNCATE了一张基础数据表结果整个测试环境所有依赖这张表的模块全部报错修复花了大半天得不偿失。一个更稳妥的做法是造数据的时候带上明显的测试标识。比如插入测试用户时用户名统一加test_前缀或者加一个固定的batch_no字段这样清理时一条DELETE就能精准搞定不会误删别人的数据。4. 联表查询验证跨表数据的核心技能4.1 INNER JOIN、LEFT JOIN的场景差异测试中经常要验证多张表的数据联动。比如用户下单后用户表要扣余额、订单表要生成订单、库存表要减库存、流水表要记一笔明细。你要验证这些数据的一致性不可能一张表一张表分开查了再自己比对直接联表查询更高效。INNER JOIN只返回两张表中匹配上的记录适合验证应该有对应关系的数据。LEFT JOIN返回左表所有记录右表没有匹配的字段显示为NULL适合验证左表存在的记录在右表是否有对应记录。我举一个典型的测试场景验证所有已支付订单是否都有支付流水。这个需求用LEFT JOIN最容易查出不匹配的数据SELECT o.order_id, o.pay_status, p.pay_id FROM orders o LEFT JOIN payment_records p ON o.order_id p.order_id WHERE o.pay_status PAID AND p.pay_id IS NULL;这条SQL查出的是已支付但没有支付流水的订单如果有结果说明系统存在数据不一致问题这就是一个真正的Bug。测试中这类校验特别管用。4.2 联表查询中的别名使用与常见错误写联表查询时给表起别名的习惯非常重要。多个表有同名字段比如每张表都可能有create_time或status如果不加别名区分SQL会报模糊错误。实践中的正确写法是SELECT o.order_id, p.pay_time FROM orders o INNER JOIN payment_records p ON o.order_id p.order_id。我还想提醒一个高频错误JOIN条件写错会导致结果集爆炸。比如两张表通过两个字段才能唯一关联你只写了一个关联条件结果就会产生笛卡尔积式的重复数据查询结果比实际数据多出无数倍。我排查过一次订单数据翻倍的问题最后发现是JOIN条件漏了o.user_id p.user_id这第二个关联字段。4.3 子查询在测试中的应用子查询也是测试中的常用手段。比如你要查购买过商品A的所有用户可以先查出购买记录里包含商品A的user_id集合再查这些用户的详细信息。写法有两种用IN子查询或用JOIN测试中的数据量通常不大两者都可以但IN子查询语义更直观SELECT user_id, user_name FROM users WHERE user_id IN ( SELECT user_id FROM order_items WHERE product_id P001 );如果你的测试数据量特别大建议用JOIN代替IN因为JOIN在多数数据库优化器里能走更好的执行计划。5. 索引与性能观测定位测试中的慢SQL5.1 索引是什么测试工程师也需要了解很多测试工程师觉得索引是开发或DBA才需要管的东西。其实不然。你写的SQL如果没走对索引一条本来几毫秒的查询会变成几秒钟直接影响测试执行效率。尤其是接口性能测试和全量回归测试阶段慢SQL一多会导致整个测试进度被拖累。索引的核心原理可以类比成一本书的目录没有目录你要一页页翻有目录你直接翻到对应页码。数据库里的索引就是给表的某个或某几个字段建立快速查找路径。测试中最常见的是普通索引和唯一索引。查询条件经常用的字段比如订单号order_id建议建索引而唯一索引可以保证字段值不重复在造数据的时候还能帮你防止插入重复数据。5.2 用EXPLAIN快速分析SQL执行计划排查SQL效率问题时EXPLAIN是必备工具。用法超级简单在SQL前面加EXPLAIN关键字执行后数据库会告诉你这个SQL打算怎么执行。关键要看几个字段type表示访问类型从好到差依次是const、eq_ref、ref、range、index、ALLALL代表全表扫描说明你的SQL没有走索引需要重点排查key表示实际使用的索引名rows是一个估算值表示预计要扫描多少行这个数字越大说明SQL越低效。我之前排查过一个典型的案例查询一条订单记录耗时2秒多用EXPLAIN一看type是ALL全表扫了两百多万行。后来发现order_id字段没建索引建议开发加了索引之后同样一条SQL几十毫秒就返回了。整个排查过程不到十分钟但如果没有EXPLAIN这个工具你可能还在那里怀疑是不是数据库服务器性能问题。5.3 测试环境与生产环境的性能差异提醒这里有一条重要的经验测试环境的SQL执行耗时和生产环境往往差异巨大因为数据量完全不在一个数量级。你在测试环境看一条SQL跑200毫秒觉得没问题但在生产环境可能因为数据量增长变成1秒、甚至5秒这就可能在真实的流量场景下拖垮接口。所以我的建议是测试工程师不要光看SQL能不能查出正确结果还要养成跑EXPLAIN的习惯看关键查询是否走索引、预计扫描行数是否合理。如果发现明显是全表扫描要提缺陷或反馈给开发这是性能隐患不只是测试效率问题。6. 事务与锁保证测试数据一致性的基础概念6.1 手动控制事务测试联动的硬保障造数据时如果涉及多张表关联插入最稳妥的做法是把多步操作包在一个事务里。MySQL中默认是自动提交每一条SQL执行完就立即生效无法回滚。手动控制事务的语法是START TRANSACTION; INSERT INTO users (user_id, user_name) VALUES (U001, test_user); INSERT INTO user_account (user_id, balance) VALUES (U001, 1000); COMMIT;这个事务保证了users表和user_account表的插入要么同时成功要么同时失败。如果中途某条SQL执行失败你可以执行ROLLBACK把整个事务回滚不会留下只有用户没有账户这种脏数据。事务的经典特性ACID我简单解释一下原子性指事务中所有操作要么全部成功、要么全部失败就像转账要么扣款和入账都完成要么都不发生一致性指事务前后数据状态符合业务规则隔离性指多个事务并发执行时互相不干扰持久性指事务一旦提交数据永久生效。对测试工程师来说理解原子性和持久性已经能覆盖日常90%以上的事务应用场景。6.2 隔离级别与锁测试并发场景时要注意什么并发测试中会涉及隔离级别和锁的概念。MySQL默认隔离级别是REPEATABLE READ可重复读意味着同一个事务内多次查询结果一致。如果你在并发测试中发现数据出现了明明事务提交了另一个连接却查不到的情况多半跟隔离级别或事务未提交有关。这里有一个我反复用到的小技巧测试并发接口时为了确认数据库层面的真实数据变化建议新开一个数据库连接去查询不要复用已经开启事务的连接。因为同一个连接里未提交的事务修改可能可以被自己查到容易造成数据已生效的误判。在实际工作中我把这个坑叫同连接事务幻觉不少测试都栽在上面。锁方面最直观的场景是一个测试人员开启事务执行了UPDATE但没提交另一个测试人员再去UPDATE同一行数据时会被阻塞等待。这不是数据库卡死了是行锁被第一个事务持有。排查这种问题时可以用SHOW PROCESSLIST查看当前连接和执行的SQL找到那个一直挂着没结束的事务确认后要么让其提交要么杀掉对应连接。这类情况在共享测试环境里特别常见掌握查看命令能省下很多沟通成本。6.3 隔离级别设置查看与修改命令查看当前会话的隔离级别用SELECT transaction_isolation临时修改用SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED。测试工程师不太需要深入理解每种隔离级别的实现细节但要清楚不同隔离级别下相同的并发操作可能产生不同的数据表现。如果你测的是一个高并发扣库存的接口发现库存出现负数先别急着报Bug去确认一下数据库隔离级别和接口的事务实现方式这个排查思路会帮你少走很多弯路。7. 测试场景中的高阶技巧与实战案例7.1 造数据脚本的模板化管理我工作中积累的一个经验把常用的造数据SQL整理成模板脚本按业务模块分门别类存放。每次接到新需求需要造数据直接复制模板修改参数比从头写SQL快得多。一个典型的造数据脚本大概长这样-- 造测试用户 INSERT INTO users (user_id, user_name, phone, reg_time) VALUES (U_20240101_001, test_user_001, 13800000001, NOW()); -- 造用户账户并初始化余额 INSERT INTO user_account (user_id, balance, version) VALUES (U_20240101_001, 1000.00, 0); -- 造一张已支付订单 INSERT INTO orders (order_id, user_id, amount, pay_status, create_time) VALUES (O_20240101_001, U_20240101_001, 99.50, PAID, NOW());脚本化之后你的数据准备时间能从十几分钟压缩到几秒钟。另一个细节凡是脚本造出来的数据我都会在关键字段上标注测试特征比如ID前缀加TEST_或时间戳这样清理时一条SQL就能精准搞定而且不会误伤手工测试同学的正常数据。7.2 清理数据的正确思路与操作顺序清理数据是有顺序讲究的。先删子表、再删父表因为有外键约束的表删除顺序反了会报错。举例来说订单明细表(order_items)引用了订单表(orders)的主键清理时必须先删order_items再删orders。但现实测试环境中很多表压根没建外键这时候删除顺序虽然不会报错但如果你乱删可能会出现明细还在、主单已删的空壳记录影响下一轮测试。一个更稳的清数思路是不直接删除原表数据而是把测试数据所在行标记成废弃状态或者整体迁移到一张归档表。不过这种做法需要和开发约定如果测试环境的数据口径完全由你控制直接DELETE最省事。还有一点必须提醒清理前先备份。哪怕是在测试环境养成SELECT * FROM orders WHERE ...先确认影响行数的好习惯能避免很多意外。7.3 数据校验的黄金组合界面、接口、数据库三查合一真正严格的测试需要把界面展示、接口返回、数据库记录三者对齐校验。我把它叫三层一致性验证。举个例子测一个订单详情页界面显示订单状态为已发货接口返回的JSON里order_status是SHIPPED这两个一致还不能立刻断言通过。你还得去数据库里查orders表的实际状态字段如果表里是PAID而接口返回SHIPPED说明接口层存在数据转换错误或缓存未更新的问题。实际执行中先跑接口拿返回结果再用接口返回的关键字段比如order_id去数据库里比对最后对照界面展示。这套组合拳打下来很多隐蔽问题才会现出原形。我在之前的项目里靠这种方式查出过好几个接口返回正常但数据库实际数据错误的深层Bug如果只看界面基本发现不了。8. 常见问题与排查技巧实录8.1 SQL执行很慢应该从哪里入手排查测试中最让人抓狂的问题之一就是同样一条SQL不知道为什么突然跑不动了。我的排查套路一般是三步走。第一步用EXPLAIN看执行计划确认有没有走索引、扫描了多少行第二步看是不是有锁等待用SHOW PROCESSLIST查看当前数据库连接状态如果发现大量Waiting for table metadata lock这类状态说明有其他事务占着资源第三步看是不是查询条件写得太宽泛比如LIKE %关键字%导致无法走索引。给一个具体的经验数字一张百万行级别的表走索引的精确查询应该在几十毫秒内完成如果超过500毫秒基本就能判定SQL或索引存在优化空间。你把这个基准记在心里排查时就知道问题大概出在哪个环节。8.2 数据查不到的几类隐蔽原因我整理了一个高频问题速查表覆盖测试中最常遇到的数据查不到场景现象可能原因排查方向明明有数据但SELECT查不到查询条件字段类型不匹配比如字段是VARCHAR但条件用了数值检查字段类型和条件写法查出来的结果和想象中不同数据库连接到了错误的环境比如测试连到预发库确认连接配置和当前环境WHERE条件看起来正确但返回空字段是NULL用条件永远匹配不上改用IS NULL中文条件查不到字符集或排序规则不一致查看表字符集和连接字符集时间范围查询结果不对时区设置差异导致时间偏移用NOW()和字段值对比检查这类问题大多数时候不是SQL写错了而是对数据本身和环境的理解不够。排查时先确认我在哪个环境这张表长什么样数据到底存了什么比反复改SQL更有意义。8.3 测试环境数据被污染后的自救方法共享测试环境最怕的就是数据被污染你造的数据被别人改掉了或者别人跑测试留下了一堆半成品数据导致你的用例执行总是失败。我的自救方案是造数据时尽量带上自己的测试标识同时把关键数据的查询条件设计成能精准锁定自己数据的形式。比如用户名加前缀、订单号加批次号、备注字段写入自己的标记这样不管别人怎么污染你都能一条SQL精准捞回自己需要的数据。如果污染已经发生且无法定位备份恢复是最后的底牌。我会在造完关键数据后用mysqldump导出单表数据备份测试过程中如果发现数据异常直接用备份文件恢复。这个操作在MySQL里相当实用准备大版本数据时一定要做。8.4 日常工作中的数据库操作安全底线讲几个我给自己立的规矩希望对你有参考价值。第一条任何UPDATE和DELETE操作先写WHERE、再写语句主体这是保命级的习惯。第二条操作前先SELECT确认影响范围哪怕影响一条数据也要确认。第三条严禁在测试环境执行没经过验证的脚本更不用说生产环境。第四条共享环境操作完主动清理现场不给别人留坑。这些底线听起来像老生常谈但我在真实项目中见过太多因为忽视这些规矩导致的事故比如一条未加WHERE的UPDATE把整张订单表状态全部刷成已支付开发排查了一整天。做测试的人对自己操作的数据要有敬畏心。数据库命令的熟练度不是一蹴而就的它的提升路径和测试用例设计很像——你不需要背会所有命令而是要在真实场景里反复用用多了自然就内化成自己的经验。我希望这篇整理能帮你在日常测试工作中少走一些弯路也欢迎你把自己的实战心得补充进来数据库这个领域越交流越涨经验。

相关新闻

多模态大模型对齐幻觉:检测、缓解与工程实践指南

多模态大模型对齐幻觉:检测、缓解与工程实践指南

1. 从“对齐幻觉”说起:多模态大模型的一个隐蔽陷阱第一次看到“对齐幻觉”这个词,我脑子里蹦出来的不是学术定义,而是一个特别具体的画面:你给一个多模态大模型看一张图,图里是一只猫趴在键盘上,然后问它“…

2026/10/15 6:59:51 阅读更多 →
Windows本地部署SAM3:从环境配置到图像分割Demo全流程实战

Windows本地部署SAM3:从环境配置到图像分割Demo全流程实战

聊一个最近折腾完的活儿:在Windows系统上把SAM3本地部署起来,跑通了一个图像分割demo。如果你对“点一下就把图上物体抠出来”这种能力感兴趣,又不想把图片传到任何在线平台,这篇文章应该正好合适。这里的SAM3,指的是第…

2026/10/15 6:58:51 阅读更多 →
PS5远程串流实战指南:从局域网到外网,任意设备接管主机

PS5远程串流实战指南:从局域网到外网,任意设备接管主机

先说个场景:大屏被家里人占着看剧,主机在卧室,你人躺在客厅沙发上,手机就在手边。这时候抛开“必须坐在电视前才能玩”的惯性,把PS5的画面和操作无缝拉到眼前这块小屏幕上,体验一次之后,大概率就…

2026/10/15 6:58:51 阅读更多 →

最新新闻

CentOS 7.6搭建DNS正向解析服务:BIND配置实战

CentOS 7.6搭建DNS正向解析服务:BIND配置实战

平时做运维的朋友肯定都有过这种经历:公司内部新起了一套系统,IP地址越来越多,今天要连这个、明天要连那个,总不能天天翻Excel表格。更尴尬的是,内网服务想用一个好记的域名访问,结果发现公共DNS根本不认识…

2026/10/15 7:37:59 阅读更多 →
ConcurrentHashMap 1.7与1.8源码对比:从Segment到CAS+synchronized的并发演进

ConcurrentHashMap 1.7与1.8源码对比:从Segment到CAS+synchronized的并发演进

做Java开发的朋友,多少都被ConcurrentHashMap“教育”过。面试要问,源码分析要讲,线上排查高并发问题也绕不开它。而只要一聊到源码,1.7和1.8这两个版本的区别就是永远躲不开的坎:一个是Segment分段锁,一个…

2026/10/15 7:37:59 阅读更多 →
WinForm文本编辑器源码解析与高级功能扩展实战指南

WinForm文本编辑器源码解析与高级功能扩展实战指南

简介:这份C#文本/代码编辑器专题文档,面向具备一定C#基础、想从零构建或二次开发编辑器的研发人员,解决从界面搭建、文件操作到功能扩展各环节的关键问题。文档先讲解基于WinForm与RichTextBox的基础实现,包括字体加粗/斜体/下划线…

2026/10/15 7:37:59 阅读更多 →
微信小程序投票系统怎么从零搭建?以活动评选为例的完整流程

微信小程序投票系统怎么从零搭建?以活动评选为例的完整流程

从技术视角看,在微信生态里"创建一个投票活动",本质是配置一套活动数据结构 报名审核状态机 防刷策略 数据导出能力。本文以「活动评选」场景为例,梳理从创建到发布的完整流程,并以投票帮小程序作为落地实践案例。 …

2026/10/15 7:37:59 阅读更多 →
T型三电平逆变器VSG自适应控制与并离网切换优化

T型三电平逆变器VSG自适应控制与并离网切换优化

1. 项目背景与核心价值电力电子变换器在新能源发电系统中扮演着关键角色,而T型三电平逆变器因其高效率、低损耗的特性,在中大功率场合得到广泛应用。传统逆变器控制策略在并离网切换过程中常面临暂态冲击大、同步性能差等问题,这正是虚拟同步…

2026/10/15 7:37:59 阅读更多 →
软件的本质是行为:REA式行为克隆全流程拆解与实操复盘

软件的本质是行为:REA式行为克隆全流程拆解与实操复盘

说真的,看到“REA三天狂揽12万星”那条标题的时候,我第一反应是:这又是标题党?一个Agent,不用源码就能克隆一切软件,听起来太像营销号编出来的故事。但等我顺着链接把演示看完,又拿自己手头一个…

2026/10/15 7:36:59 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →