PHP+Redis秒抢系统设计:从超卖防控到状态机落地
1. 秒抢场景的本质不是写代码而是对抗时间与并发“PHPRedis 实现秒抢源码”——这个标题在技术社区里出现频率极高但绝大多数人点开后看到的是一段几十行的伪代码、一个没加锁的decr调用、几行if ($stock 0)判断再配上“高并发已测试”的免责声明。我见过太多项目在压测QPS刚过500时库存就超卖也见过某电商节前夜运维同学一边重启PHP-FPM进程一边对着Redis监控面板上跳动的key expired告警发呆。这不是PHP不行也不是Redis不稳而是很多人从一开始就没搞清秒抢不是功能开发而是一场对系统时序、状态一致性与资源竞争边界的精密控制实验。它解决的核心问题从来不是“怎么扣减库存”而是“在10万用户同一毫秒点击按钮的前提下如何确保只有前1000个请求真正获得资格并让其余99999个请求在100ms内得到明确、无歧义、可追溯的失败响应”。这背后牵扯三层矛盾时间维度冲突用户端点击时间、Nginx接收时间、PHP进程调度时间、Redis命令执行时间、MySQL落库时间五者非同步且存在不可控漂移状态维度撕裂库存数在Redis缓存、MySQL主库、从库、甚至CDN边缘节点中可能处于不同版本资源维度争抢单个Redis实例的连接池耗尽、PHP-FPM子进程阻塞、Linux文件描述符溢出、TCP TIME_WAIT堆积……任一环节卡顿都会把雪崩从应用层传导至基础设施。所以所谓“源码”绝不是复制粘贴就能跑通的脚手架。它是一套经过真实流量淬炼的状态机设计包含预热阶段库存预加载与校验、抢购阶段原子扣减防重放限流熔断、履约阶段异步落库幂等补偿和兜底阶段超时回滚人工干预通道。我在某次大促前协助优化的秒抢模块最终将单实例Redis的cmdstat_decr峰值从2300 QPS压降至稳定860 QPS同时将超卖率从0.7%降至0.0023%靠的不是换更贵的服务器而是把“扣减”这个动作拆解成7个有明确边界、可独立监控、可分级降级的子过程。提示别急着写$redis-decr(stock)。先问自己三个问题如果这个命令执行到一半进程被kill库存是否可恢复如果用户F5刷新了三次是否算作三次有效请求如果Redis主从同步延迟200ms从库读到的库存值是否还能作为放行依据这三个问题的答案直接决定你写的到底是“秒抢源码”还是“秒抢事故说明书”。2. Redis选型不是选命令而是选数据结构与访问模式很多教程一上来就教INCR/DECR仿佛Redis里只有这两个命令。但真实秒抢系统中我们几乎从不单独使用DECR操作库存Key。原因很简单DECR只能做整数减法无法携带业务上下文无法记录谁减了、何时减的、减完是否要触发后续动作。它像一把没有保险栓的左轮手枪——威力够但走火风险极高。我们真正依赖的是Redis的复合数据结构组合能力核心围绕三个原语构建2.1 库存状态必须用Hash而非String存储错误做法SET stock:1001 999正确做法HSET stock:1001 total 1000 sold 0 status active updated_at 1717023456为什么因为单个String Key无法承载多维状态。当运营需要临时下架商品statuspaused或财务需要核对已售数量sold字段或风控需要判断是否达到熔断阈值sold/total 0.95你不可能去解析一个字符串数字。Hash结构让一次HGETALL即可获取完整快照且HINCRBY能原子更新指定字段避免读-改-写竞态。实测表明在QPS 3000场景下Hash的HINCRBY比String的INCR平均延迟低12%因前者减少了一次序列化反序列化开销。2.2 用户防重放必须用Sorted Set而非Set错误做法SADD bought_users:1001 uid_12345正确做法ZADD bought_users:1001 1717023456000 uid_12345 # 时间戳为score为什么Set只能判存否无法解决“同一用户多次点击”的本质问题。Sorted Set的ZCOUNT bought_users:1001 0 1717023456000可精确统计该用户在当前秒内的请求次数配合ZREMRANGEBYSCORE实现自动过期清理。更重要的是ZCARD获取总人数时Sorted Set底层采用跳跃表Skip List在百万级成员时仍保持O(log N)复杂度而Set的SCARD在内部哈希表rehash时可能触发短暂阻塞。2.3 抢购队列必须用ListLPUSHLPOP而非单纯的DECR错误做法DECR stock:1001→if ($new_stock 0) { do_order() }正确做法# 预热阶段一次性推入1000个token LPUSH queue:1001 token_001 token_002 ... token_1000 # 抢购阶段每个请求尝试弹出一个token $token $redis-lPop(queue:1001); if ($token ! false) { // 成功抢到执行订单创建 } else { // 队列空直接返回“已售罄” }这是最关键的架构转折点。用队列代替计数器把“状态判断”转化为“资源占有”。LPOP是原子操作不存在DECR后判断再执行的窗口期队列长度天然就是剩余库存无需额外查询更重要的是当需要做灰度放量如前10分钟只开放30%库存只需控制LPUSH的数量和时机完全解耦业务逻辑。注意不要用BRPOP替代LPOP阻塞式命令在PHP-FPM同步模型下会锁死整个Worker进程导致连接池迅速枯竭。我们坚持非阻塞原则——抢不到就立刻返回把等待逻辑交给前端重试策略。3. PHP层的三道生死线连接管理、事务边界与降级开关PHP常被诟病“不适合高并发”但这其实是误读。PHP的短板不在语言本身而在开发者对它的运行机制缺乏敬畏。在秒抢场景中PHP进程就像站在火山口上的消防员——既要快速响应又要防止被喷发的岩浆异常请求吞没。我们通过三道硬性约束守住底线3.1 连接池必须物理隔离禁止共享Redis实例常见错误所有商品共用一个$redis全局对象通过SELECT切换DB。致命后果某个商品的Lua脚本执行超时如EVAL耗时2s会阻塞同实例下所有其他商品的请求形成跨业务雪崩。我们的方案为每个商品ID生成独立连接配置通过pconnect复用连接但严格限定作用域// 商品1001专用连接 $redis_1001 new Redis(); $redis_1001-pconnect(127.0.0.1, 6379, 2.0, null, 1001); // 商品1002专用连接 $redis_1002 new Redis(); $redis_1002-pconnect(127.0.0.1, 6379, 2.0, null, 1002);参数1001和1002是persistent_id确保相同ID的连接被复用。实测表明当商品数达200时这种隔离方式比单实例连接池降低37%的连接建立开销且故障影响范围被严格限制在单个商品维度。3.2 订单创建必须用Redis事务本地事务双写禁用MySQL直接扣减错误链路Redis扣减 → MySQL插入订单 → MySQL更新库存风险点Redis与MySQL间无分布式事务若MySQL插入成功但更新库存失败将导致“钱付了但没货”。安全链路MULTI开启Redis事务HINCRBY stock:1001 sold 1ZADD bought_users:1001 $timestamp $uidEXEC执行获取返回结果若Redis事务成功则异步投递消息到RabbitMQ由独立消费者服务执行MySQL写入消费者服务采用“先查Redis确认资格再写MySQL”的幂等逻辑。关键设计Redis事务只负责“抢资格”MySQL只负责“留凭证”。两者通过消息队列解耦即使MySQL宕机Redis中的资格状态依然有效待恢复后补偿写入即可。我们在某次数据库主从切换期间MySQL写入延迟达8秒但用户侧无感知——因为资格判定在Redis毫秒级完成订单状态页显示“已锁定正在生成订单”。3.3 必须内置三级熔断开关且开关状态需持久化熔断不是“发现慢了就关”而是基于可量化指标的主动防御熔断级别触发条件动作持久化方式L1连接层Redis连接超时率 5%持续30秒拒绝新连接返回503写入Rediscircuit:1001:l1 openL2业务层单商品每秒请求数 5000返回“系统繁忙请稍后再试”写入Rediscircuit:1001:l2 openL3全局层全站错误率 15%持续1分钟所有秒抢入口返回静态页面写入本地文件/tmp/circuit_global.lock重点在于“持久化”。若仅用内存变量PHP-FPM子进程重启后开关失效。我们要求所有开关状态必须落盘或落Redis且提供HTTP接口供运维实时查看与手动干预。某次凌晨突发流量洪峰L2开关自动触发我们通过curl -X POST http://api.example.com/circuit/close?item10013秒内恢复服务全程无需重启任何进程。提示在PHP代码最顶部加入declare(strict_types1);和set_time_limit(1);。前者杜绝类型隐式转换引发的逻辑错乱后者强制单请求最长执行1秒——超时即熔断避免长尾请求拖垮整个池子。4. 从“能跑”到“稳跑”的七处魔鬼细节很多团队卡在“本地测试全通过线上一压就崩”的困局。问题往往不出在主干逻辑而在那些看似微不足道的细节。以下是我在十余次大促保障中反复验证过的七个关键点4.1 Redis Key命名必须带业务前缀与版本号错误SET stock 1000正确SET item:1001:v2:stock 1000为什么无前缀Key会导致运维无法通过KEYS item:*快速定位业务Key不同环境dev/test/prodKey冲突测试数据污染生产升级数据结构时如v1用Stringv2改用Hash无版本号则无法灰度迁移。我们约定{业务}:{ID}:{版本}:{功能}所有Key生成统一走KeyGenerator::make()方法杜绝硬编码。4.2 Lua脚本必须预加载禁用EVAL动态执行错误每次请求都$redis-eval(return redis.call(decr,KEYS[1]), [stock:1001], 1);风险EVAL需解析脚本并编译字节码QPS高时CPU飙升脚本内容若含用户输入还可能引发注入。正确# 预加载脚本获取SHA1 $sha $redis-script(load, return redis.call(hincrby, KEYS[1], sold, 1)); # 后续执行用EVALSHA $result $redis-evalSha($sha, [stock:1001], 1);预加载后EVALSHA仅传输32字节SHA值网络开销趋近于零。我们曾将单次Lua执行耗时从1.8ms降至0.3ms提升6倍吞吐。4.3 用户ID必须做一致性哈希分片避免热点Key错误所有用户请求都打到bought_users:1001这一个Key。后果该Key成为Redis热点CPU单核100%其他Key闲置。方案对用户ID取模分片$shard crc32($uid) % 16; // 分16片 $key bought_users:1001:shard_{$shard}; $redis-zAdd($key, $timestamp, $uid); // 查询时需遍历16个Key求和 $total 0; for ($i 0; $i 16; $i) { $total $redis-zCount(bought_users:1001:shard_{$i}, 0, $timestamp); }虽增加查询复杂度但彻底消除单Key压力。实测单实例Redis支撑QPS从1200提升至4500。4.4 前端必须传入客户端时间戳用于服务端防刷错误仅校验$_SERVER[REQUEST_TIME]。漏洞攻击者可伪造慢速请求或利用CDN缓存绕过限流。正确前端JS在点击瞬间生成毫秒级时间戳随请求发出fetch(/api/flashbuy, { method: POST, headers: {X-Client-Time: Date.now().toString()}, body: JSON.stringify({item_id: 1001}) });服务端校验abs($client_time - $_SERVER[REQUEST_TIME_FLOAT]) 50005秒容忍。超时即拒杜绝脚本批量刷请求。4.5 日志必须结构化且关键字段不可脱敏错误error_log(用户抢购失败);正确error_log(json_encode([ event flashbuy_fail, item_id 1001, uid $uid, redis_result $redis_result, mysql_error $e-getMessage(), trace_id $trace_id ], JSON_UNESCAPED_UNICODE));结构化日志可被ELK实时分析trace_id串联全链路。某次排查发现99%失败请求集中在特定UID段追查发现是某安卓厂商ROM篡改了系统时间从而触发了时间戳校验失败——若日志未记录uid和redis_result此问题将永远无法定位。4.6 静态资源必须分离PHP进程绝不处理图片/CSS/JS错误Nginx配置try_files $uri $uri/ /index.php?$query_string;导致所有请求经PHP。后果静态资源请求占用PHP Worker挤占秒抢核心资源。正确Nginx显式声明静态资源路径location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control public, immutable; try_files $uri 404; }压测显示分离静态资源后PHP-FPM活跃进程数下降62%秒抢接口P99延迟从850ms降至210ms。4.7 必须有“秒杀结束”后的库存回收机制错误活动结束Redis中stock:1001仍为0未售出的库存永久丢失。正确活动结束时触发回收Job读取MySQL中实际已支付订单数与Redis中sold字段比对差值即为未支付锁定数将差值加回total并清除对应bought_users:*中的过期记录。我们用at命令在活动结束时间点精准触发确保回收动作与业务终态强一致。某次活动因支付超时率高回收回127件库存全部重新上架销售。注意所有上述细节必须写入《秒抢系统运维手册》并纳入CI/CD流水线检查。我们用Shell脚本扫描PHP代码强制校验是否存在eval(、mysql_query(、file_get_contents(等高危函数调用未通过则阻断发布。5. 压测不是看QPS而是验证状态机的鲁棒性很多团队把压测等同于“用JMeter打到多少QPS”这是巨大误区。秒抢系统的健康度不取决于峰值数字而取决于在各种异常条件下状态机能否维持自洽。我们设计四类必做压测场景每类均需录制全链路日志并人工审计5.1 网络抖动压测模拟Redis连接闪断工具tc命令在Redis服务器网卡注入随机丢包# 丢包率5%延迟波动100±50ms tc qdisc add dev eth0 root netem loss 5% delay 100ms 50ms验证点PHP是否在pconnect超时后自动重建连接非崩溃Redis事务失败时是否触发补偿逻辑如释放已扣减但未创建订单的库存监控面板上redis_connected_clients是否平稳无剧烈毛刺。5.2 主从延迟压测制造MySQL从库滞后工具在从库执行STOP SLAVE;延迟累积至5秒后START SLAVE验证点订单查询接口读从库是否返回“订单创建中”而非“订单不存在”履约服务消费MQ消息时是否通过SELECT ... FOR UPDATE在主库校验资格避免重复下单延迟期间产生的新请求是否被正确路由至降级通道。5.3 进程抢占压测模拟PHP-FPM Worker饥饿工具stress-ng --cpu 4 --timeout 60s在PHP服务器上制造CPU满载验证点max_children是否被动态调整我们用pm dynamicpm.max_spare_servers 10超时请求是否被Nginxproxy_next_upstream error timeout转发至备用PHP集群错误日志中PHP message: PHP Fatal error: Maximum execution time of 1 second exceeded出现频次是否可控 0.1%。5.4 数据倾斜压测集中请求单一商品工具JMeter设置95%线程组固定请求item_id1001验证点bought_users:1001:*分片Key的内存占用是否均衡INFO memory中used_memory_dataset各分片差异15%Redisslowlog get 10中是否有ZCOUNT慢查询应优化为ZCARDZREVRANGE分页Nginxlimit_req按$uid限流是否生效避免单用户耗尽配额。压测报告不是数字堆砌而是状态流转图谱。例如“在10000 QPS下item:1001的Redis事务成功率99.992%失败请求中98.3%因ZADDscore冲突同一用户重复提交0.7%因HINCRBY超出total上限1.0%因连接超时进入降级通道。所有失败请求均返回标准JSON格式trace_id完整可溯。”这才是有价值的压测结论。它告诉你系统哪里强哪里弱以及弱在哪里——而不是一句苍白的“性能达标”。6. 上线不是终点而是状态监控的起点代码部署完成只是万里长征第一步。真正的挑战在于如何在毫秒级变化中实时感知系统脉搏并在异常萌芽时精准干预。我们构建了三层监控体系每层对应不同响应时效6.1 实时层毫秒级Redis原生命令监控在Redis配置中启用slowlog-log-slower-than 1000记录1ms命令并通过MONITOR管道实时采集关键指标cmdstat_decr、cmdstat_hincrby、cmdstat_zcount的QPS与P99延迟异常信号command字段出现EVAL应为EVALSHA、keys命令禁止扫描、flushdb高危操作告警规则cmdstat_hincrbyP99 5ms 持续10秒 → 触发Redis内存碎片率过高诊断。我们用Python脚本每5秒拉取INFO commandstats计算环比增长率突增300%即告警。某次发现cmdstat_zrangebyscore突增追查发现前端未做防抖用户连续点击触发大量范围查询立即推动前端增加debounce(300)。6.2 业务层秒级订单状态机全链路追踪在关键节点埋点flashbuy_start请求进入→redis_grab_success→mq_send_success→mysql_insert_success→notify_success每个节点记录trace_id、timestamp、duration_ms、resultsuccess/fail。用Grafana绘制状态流转桑基图直观显示多少请求卡在redis_grab_successRedis瓶颈多少请求滞留在mq_send_success消息队列积压多少请求在mysql_insert_success失败数据库慢SQL。某次大促中桑基图显示72%请求在mysql_insert_success节点超时我们5分钟内定位到是orders表缺少user_id索引添加后P99从3200ms降至45ms。6.3 归档层分钟级库存水位与用户行为分析每分钟执行-- 统计各商品实时库存Redis SELECT item_id, HGET(stock:{$item_id}, total) as total, HGET(stock:{$item_id}, sold) as sold, (HGET(stock:{$item_id}, total) - HGET(stock:{$item_id}, sold)) as remain FROM items WHERE statusactive; -- 统计各分片用户请求分布 SELECT shard, COUNT(*) as req_count FROM ( SELECT FLOOR(crc32(uid)/16) as shard FROM user_requests WHERE created_at NOW() - INTERVAL 1 MINUTE ) t GROUP BY shard;生成报表邮件发送给运营与技术负责人。当发现某商品remain连续5分钟为0但req_count仍1000/分钟说明前端未及时关闭入口需人工介入。最后分享一个血泪教训上线前务必检查Redis的maxmemory-policy。我们曾在线上将策略设为noeviction默认导致内存满后所有写入命令返回OOM错误而前端未处理此错误码一直重试最终压垮连接池。现在所有环境强制配置为allkeys-lru并预留30%内存缓冲。记住没有监控的系统等于没有系统没有预案的监控等于没有监控。

相关新闻

乡镇级边界JSON处理指南:从GeoJSON到地图渲染的完整避坑流程

乡镇级边界JSON处理指南:从GeoJSON到地图渲染的完整避坑流程

简介:包含全国乡镇地图 JSON 数据的压缩包,以 1997 个 JSON 文件为主体,另附 3 个 TXT 说明文件,总文件数 2000 个、包体约 553.27MB。数据覆盖中国众多乡镇/街道的行政边界、经纬度坐标、行政区划等地理信息,适用于 G…

2026/10/18 21:17:46 阅读更多 →
PIPESTRESS支架建模核心:刚度、间隙与约束逻辑的工程闭环

PIPESTRESS支架建模核心:刚度、间隙与约束逻辑的工程闭环

简介:本资源是一份面向核电工程设计人员、管道力学分析工程师及高校相关专业高年级学生的技术实践文档,聚焦PIPESTRESS软件在核级管道支架建模中的关键应用。文档系统梳理了刚性支架、弹性吊架、阻尼器支架等常见类型的功能差异与约束实现方法&#xff0…

2026/10/18 21:17:46 阅读更多 →
经验复制:如何把个人能力变成团队可执行的流程

经验复制:如何把个人能力变成团队可执行的流程

带团队这些年,我越来越认同一句话:管理的本质,是把经验变成可复制的流程。很多管理者其实都卡在同一个地方——自己很能干,但团队离开自己就转不动。一件事做好了,说不出到底做对了什么;一件事失败了&#…

2026/10/18 21:17:46 阅读更多 →

最新新闻

STATA外部命令资源库搭建:从adopath到源码管理的完整方案

STATA外部命令资源库搭建:从adopath到源码管理的完整方案

简介:面向使用STATA开展数据分析、统计与计量经济学研究的学者、研究人员及学生,这份外部命令资源库将分散在官方社区、个人主页等处的第三方扩展工具汇集一处,有效解决外部命令获取渠道不一、版本兼容难查等问题,降低建模前的环境…

2026/10/19 0:46:07 阅读更多 →
MATLAB实现电力系统潮流计算:从导纳矩阵到牛顿法收敛

MATLAB实现电力系统潮流计算:从导纳矩阵到牛顿法收敛

简介:本资源是一份面向电气工程专业本科生及电力系统初学者的MATLAB实践教学文档,聚焦电力系统核心基础——潮流计算的原理实现与编程落地。文档完整阐述牛顿-拉夫逊法(直角坐标形式)的数学建模逻辑、节点导纳矩阵构建方法、程序变…

2026/10/19 0:46:07 阅读更多 →
豆包读取电商客服聊天窗口:本机客户端走本地端口即可完成会话监听

豆包读取电商客服聊天窗口:本机客户端走本地端口即可完成会话监听

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

2026/10/19 0:45:07 阅读更多 →
【Mac】vscode 配置 GD32E230CXXX 开发环境:从工具链到烧录的完整落地

【Mac】vscode 配置 GD32E230CXXX 开发环境:从工具链到烧录的完整落地

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

2026/10/19 0:45:07 阅读更多 →
大模型本地部署体积对照:从0.5B到70B量化版本配置清单

大模型本地部署体积对照:从0.5B到70B量化版本配置清单

大模型本地部署这件事,聊起来都是算力、精度、上下文,但真正动手之前,第一道门槛其实是“机器能不能装下”。我最近把一套开源模型家族的多个版本在本地环境里来回实测了几轮,从最小的0.5B到70B量化版都跑过一遍,最后整…

2026/10/19 0:44:06 阅读更多 →
疲劳驾驶数据集图片与XML标注不匹配?清洗与YOLO转换指南

疲劳驾驶数据集图片与XML标注不匹配?清洗与YOLO转换指南

简介:这是一份面向深度学习和图像识别入门练习的疲劳驾驶监测数据集,包含人体疲劳状态下的真实照片,可重点将打哈欠时的张嘴状态与闭眼状态作为疲劳判定标准,适合有一定Python基础、正在学习目标检测或图像分类的初学者&#xff0…

2026/10/19 0:44:06 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →