缓存降级实战:Redis故障时如何保住系统可用性
半夜两点被报警电话炸醒这件事干过后端的人多少都经历过几回。我当时维护的某个系统——一个面向移动端的点赞/收藏服务平时流量不算夸张但峰值很陡——突然收到一堆告警接口超时率肉眼可见地往上爬。第一反应登服务器缓存客户端报出一片Redis connection timeout紧接着数据库 CPU 开始飙升连接池被打满。那一晚我一边手动重启缓存节点一边眼睁睁看着数据库负载一路走高心里只有一个念头如果提前做了缓存降级局面根本不会这么难看。那次事故之后我把缓存降级是什么这个问题彻底掰开揉碎研究了一遍也在自己负责的项目里陆续落地了几套不同的降级方案。这篇就好好聊聊这个话题——它不是什么高深理论但确实能在关键时刻救整个系统一命。1. 一次线上故障让我重新理解缓存降级1.1 缓存不在了数据库扛得住吗先说当时那个点赞服务的场景。架构其实很常规请求进来先读缓存Redis缓存里有就直接返回没有就去查数据库然后回填缓存。平时命中率能稳定在 90% 上下数据库压力很小。但那天其中一个缓存节点因为某种原因发生抖动客户端大量请求直接穿透到数据库。数据库是单主从架构读流量还能撑一阵可问题在于——请求量太大连接的创建和释放本身就会拖垮数据库进程。我发现告警的时候数据库 CPU 已经冲到 80% 以上响应时间从几毫秒涨到几百毫秒。这时候我做了最本能的操作加大缓存连接池、重启故障节点、手动清理慢查询。结果呢缓存节点恢复后瞬间涌入的请求又压垮了后端服务形成了一个缓存恢复→数据库继续被冲击→服务响应缓慢→网关重试→流量更大的恶性循环。折腾了将近四十分钟系统才彻底稳定下来。事后复盘最让我汗颜的不是缓存挂了而是整个服务在缓存故障面前毫无还手之力。每一条请求都不管三七二十一去查数据库没有超时保护没有限制策略更别提降级方案。说得直白一点我的系统把缓存当成了唯一的救命稻草可它从来没想过如果稻草本身也断了应该怎么办。1.2 降级的本质用不完美换系统还能用这次事故让我对缓存降级有了一个非常朴素的认知缓存降级不是让系统变得更快而是让系统在缓存失效、缓存服务故障或极端流量冲击下依然能给出一个虽然不那么完美但还能接受的响应而不是整体宕机。打个最简单的比方。平时你去商场电梯是主力通道。哪天电梯坏了正常思维是——反正楼梯也能走只是慢一点累一点。可如果商场在大门口就挂个牌子说电梯坏了今天暂停营业你觉得合理吗缓存降级就是那条楼梯它的存在不是为了跟电梯比速度是为了在电梯坏掉的时候至少还能让顾客进得了商场、买得到东西。这个思路放到技术上就是几种常见策略的统称缓存挂了返回旧数据先顶着、缓存未命中时不让流量穿透数据库而是返回默认值、干脆关掉非核心功能保证核心链路畅通。每种做法牺牲的东西不一样但目标一致——保证系统的可用性优先于完美性。1.3 降级、熔断、限流傻傻分不清楚很多人容易把降级和熔断、限流混为一谈。我自己最开始也搞混过后来总结了一个比较清晰的区分方式限流Rate Limiting管的是量。每秒最多放 1000 个请求进来多了直接拒绝或排队。它挡在系统最前面保护的是系统承受能力。熔断Circuit Breaker管的是失败。某个下游服务连续报错次数超过阈值熔断器直接短路不再发起真实调用快速返回失败。它保护的是调用方不被拖死。降级Degradation管的是结果。允许系统在资源紧张或依赖异常时返回一个降级结果——可能是旧数据、默认值、空列表而不是让请求彻底失败。三者可以同时用也可以独立用。一个完整的高可用架构里通常是前面限流、中间熔断、关键时刻降级。但是很多项目往往只做了限流和熔断把降级这个最后的后手忘了。等到缓存挂了熔断器一短路所有请求直接返回错误——系统是没有被打死但用户体验完全崩塌。降级要解决的恰恰就是这种不完美但可用的瞬间。2. 缓存降级的不同层级从给一个响应到保住核心链路2.1 读操作降级缓存故障时还能拿什么缓存降级最常见的场景是读操作。一套完善的读链路降级通常按获取数据的方式分成下面几挡第一挡多级缓存兜底。在进程内放一层本地缓存比如 Caffeine前面再挂 Redis。Redis 挂掉时本地缓存还能继续返回一部分热数据。优点是延迟极低、基本无感缺点是本地缓存容量有限能兜住的只是高频访问的那一小撮数据。对于电商首页、推荐流这类热点集中的场景这一挡非常有效。我当时给点赞服务加的降级方案里第一层就是把用户最近 24 小时的点赞关系放到本地缓存缓存大小控制在 50MB 以内命中率能有 85% 左右。第二挡返回过期数据。给绝大多数缓存项设一个 TTL比如 10 分钟。正常情况下 TTL 到了就回填。降级模式下哪怕 TTL 已经过期也允许直接返回旧的缓存值同时放一个异步任务回源刷新。这种做法的核心是容忍短暂的数据不一致。点赞数、排行榜、商品库存这类实时性要求不高的数据完全可以用这一挡。第三挡返回静态默认值或空结构。如果连旧数据都拿不到——比如本地缓存也失效了、异步回源也失败了——那就返回一个预设的兜底值。比如推荐接口返回默认推荐列表排行榜返回空列表商品详情返回暂无数据提示。别小看这一步它能保证接口始终有 HTTP 200 响应调用方不会因为超时或 5xx 再次发起重试反而加重系统压力。2.2 写操作降级不能因为缓存挂了就拒绝写入写操作的降级常被忽略但往往比读操作更致命。一个典型的场景用户刚下单支付回调把订单状态写入 Redis再异步同步到数据库。如果 Redis 刚好挂了这一笔写操作怎么处理处理方式一般分两种同步转异步把写操作投递到消息队列等缓存恢复后再回放。用户侧能感知到的只是订单状态更新略有延迟不会导致订单丢失。降级为直接写库缓存挂了就别绕弯子直接把数据写到数据库同时给监控系统发一个告警。等缓存恢复后再异步回填。这种方式适合高频、单条数据量小的写操作。我后来在另一个项目里就是两者结合正常情况走缓存缓存异常时直接写库并标记一条异常写记录之后通过定时任务把数据库中新数据补写进缓存。这个方案没有引入额外的消息队列组件代码改动也小效果却很不错。2.3 核心链路与非核心链路的取舍并不是所有功能都值得降级到最后一刻。一个运行良好的系统必须知道什么功能是命根子。对电商系统来说下单、支付、库存扣减是命根子绝不能因为缓存挂了就让用户付不了款而首页推荐、热门搜索、领券中心这些属于锦上添花完全可以在缓存故障时关掉或换成简化版本。这就是功能降级。实际执行时通常结合网关规则把某个接口标记为可降级当降级开关打开时网关直接返回静态响应不再转发到后端服务。这样做的收益是巨大的——移除了一大批非核心请求对后端资源的占用让核心链路有更充足的容量去应对流量高峰。我自己的做法是给每个接口设置一个降级优先级P0核心链路永远不降级、P1重要但可降级到简化逻辑、P2非核心直接返回静态值。运维只需要在控制台上拉一个开关就能按照优先级逐级降级整个过程不需要发版。3. 什么情况下会触发降级判断信号与阈值设计3.1 缓存服务异常信号错误率比错误数更可靠自动触发降级首先要回答一个问题怎么判断缓存不行了看错误数是最直接的办法但有个坑并发低的时候偶尔 10 次错误可能不算什么但在高并发下10 次错误可能根本来不及等你处理就已经变成几千次了。所以我更建议用滑动窗口内错误比例作为判断条件。举个例子开一个 10 秒的滑动窗口统计窗口内缓存读请求总数和失败总数。如果失败比例超过 30%就认为缓存进入异常状态立刻切换降级模式。如果只是偶尔一两根超时比例没到阈值就不需要大动干戈。这个比例可以调建议用 20% 到 40% 之间太低了容易误触发太高了反应太慢。3.2 缓存命中率暴跌信号比你想的更早出现第二个信号是缓存命中率。正常情况下命中率会保持在一个相对稳定的区间比如 85% 到 95%。一旦出现断崖式下跌——比如从 90% 直接跌到 40%——基本可以断定有两种可能缓存服务出问题了大量请求穿透到数据库。某个热点 Key 被淘汰或过期导致瞬间大量回源。无论是哪种都说明缓存这个防护层已经不可靠。这时候可以自动触发降级而且不需要等缓存服务彻底宕机。我建议命中率下跌到阈值以下后先做一小段观察期比如 20 秒如果命中率还没恢复再进入降级模式。设置观察期的目的是避免某些瞬时抖动造成频繁切换反而颠簸不停。3.3 热点 Key 与单节点过载信号第三个信号比较隐蔽某个单一 Key 的请求量突增导致承载它的缓存节点 CPU 飙升。Redis 是单线程模型一个热点 Key 的 QPS 极高时会占满整个节点的事件循环其他 Key 的读写全被拖慢。这种场景下缓存服务本身活着但从业务角度已经不可用了。你盯着错误率看可能完全正常因为操作都能成功只是慢。判断方法可以靠 P99 延迟曲线如果 Redis 读操作 P99 从 2ms 涨到 100ms 以上同时某个 Key 的访问次数占比奇高就需要触发降级。比较实用的降级做法是针对热点 Key 在本地缓存做一层短 TTL 的副本把 Redis 的访问压力切走。3.4 自动触发与手动开关的配合依赖自动触发没问题但我强烈建议保留一个手动降级开关。原因很简单自动判断的逻辑再完善也总有预判不到的情况。比如某次上线新功能代码里有 bug 导致缓存写入异常错误率指标可能正常但数据全是脏数据——这时候靠规则很难发现人工介入降级反而是最快的。手动开关的设计要足够简单。我在配置中心里维护了一个降级配置项类似{ degradation: { enabled: true, level: 2, expireBackup: true } }运维只要把enabled改为true指定降级层级服务就能在秒级内读到最新配置并执行降级逻辑。我建议配置变更最好支持灰度发布别一把推全量尤其是核心链路降级很容易因为操作失误造成更大范围的影响。4. 降级方案的落地实现从简单到复杂的三种设计4.1 方案一缓存读取包裹降级逻辑适用大多数场景最简单的落地方式是把降级逻辑直接写进缓存读取的工具类里。下面是一段比较典型的伪代码思路def get_with_fallback(key, loader, ttl): try: value cache.get(key) if value is not None: return value except CacheUnavailableError: # 缓存服务不可用尝试本地备份 local_value local_cache.get(key) if local_value is not None: return local_value # 本地缓存也没有降级到默认值 return default_value(key) # 缓存未命中走真实数据源 value loader() cache.set(key, value, ttl) return value这个方案的优点是侵入性小改动集中在一个公共方法里业务方几乎无感知。但它有一个明显的弱点降级判断是请求级别的每个请求都要先尝试访问缓存缓存故障时每个请求都会白白等一个超时。如果超时设为 500ms降级期间的接口响应就会整体变慢。要解决这个弱点可以在异常第一次触发时就把状态位打开后续请求直接走降级逻辑不再尝试访问缓存。伪代码如下def get_with_degradation(key, loader, ttl): if degradation_manager.is_degraded(): return local_or_default(key) try: value cache.get(key) if value is not None: return value except CacheUnavailableError as e: degradation_manager.mark_degraded() return local_or_default(key) value loader() cache.set(key, value, ttl) return value这里我把判断是否降级抽成了一个独立模块既方便做状态管理也方便和配置中心对接。4.2 方案二多级缓存过期副本适用读多写少如果你的系统读多写少且对数据实时性要求不那么苛刻我推荐用这个方案它以三级缓存来兜底L1 本地缓存Caffeine容量小但访问最快。L2 分布式缓存Redis容量大是主要的数据来源。L3 过期副本本地文件或数据库备份只在 L1 和 L2 都失效时读取。平时请求先查 L1没命中再查 L2再没命中才回源并把结果同时写回 L1 和 L2。降级时L2 不可用L1 继续顶着如果 L1 也没有直接读 L3 的最后一刻快照。这套设计在实际项目中应对缓存故障非常有效。我做过一次模拟测试同时拔掉 Redis 和数据库服务依然能返回最近一次快照内容响应时间大约在 10ms 以内用户几乎无感。4.3 方案三基于配置中心的动态降级适用中大型团队如果团队规模大一些接口数量多我建议把降级做成统一的平台能力。核心包括三件事配置中心统一管理降级规则支持按接口、按用户分组、按流量比例设置降级策略。降级执行器统一处理所有接口的降级逻辑统一收敛在网关层或 SDK 层业务方只需声明允许降级并指定兜底数据来源。恢复机制自动执行降级不是一锤子买卖要能自动或半自动地恢复。我通常会给降级管理器加一个半开状态——降级有一段时间后允许 1% 的流量重新尝试缓存读取如果成功率恢复到阈值以上再逐步放开全量流量。下面是我常用的 Python 实现片段核心是半开状态切换class DegradationManager: def __init__(self, threshold0.3, window10): self.threshold threshold self.window window self.state closed # closed - open - half_open self.fail_count 0 self.total_count 0 self.half_open_trials 0 def record(self, success): self.total_count 1 if not success: self.fail_count 1 self._update_state() def _update_state(self): if self.state closed: ratio self.fail_count / self.total_count if self.total_count self.window and ratio self.threshold: self.state open print(进入降级模式) elif self.state open: # 过一段时间后允许试探 self.half_open_trials 1 if self.half_open_trials % 100 0: self.state half_open elif self.state half_open: # 在 half_open 中如果成功率够高恢复 closed if self.fail_count / self.total_count self.threshold: self.state closed self.fail_count 0 self.total_count 0 print(恢复全量流量)这段代码省去了很多边界细节但核心思想是完整的不搞一刀切降级之后要有试探恢复的通道否则缓存恢复后系统永远回不到正常状态。5. 我踩过的坑和经验教训降级方案没那么简单5.1 坑一降级时所有请求同时打库——你以为的兜底其实是加速死亡新手最容易踩的坑是缓存挂了降级逻辑走直接查数据库结果数据库瞬间被击穿。这种情况跟没有降级没什么区别甚至更糟——降级本意是保护系统结果变成往数据库上再补一刀。我做过的正确示范是降级链路里必须再套一层限流器。降级状态下只允许一定比例的请求穿透到数据库其余请求直接返回默认值或过期副本。比例可以按数据库容量动态调整比如平时 QPS 1000降级时只放 50 进来剩下的全走静态兜底。这给数据库留了喘息的空间等缓存服务恢复后再逐步放量。5.2 坑二降级状态没有恢复机制导致假死几小时有一次我负责的一个列表页在凌晨发生缓存故障自动降级生效但设置的时间窗口计算有误导致降级状态一开就再也回不去。第二天早上缓存服务早就好了所有用户却仍看到的是过期几小时的数据而且因为降级状态下不查缓存也不查库数据一直不更新。这比故障本身更严重。从那以后我强制要求降级方案必须带恢复探测机制而且恢复探测要主动去做不能等请求过来了才试。可以写一个定时任务每 30 秒对缓存做一次ping或get探测只要连续两次成功就把状态置为半开让部分流量先走正常路径确认无问题再全量恢复。5.3 坑三降级粒度过粗连核心链路都被误伤另一个常见问题是把降级做得太大气了——缓存一挂全站所有读接口统统走默认值。我见过一个项目把商品详情的库存显示也纳入降级范围结果用户看到库存充足但实际下单时根本没货客服电话直接被打爆。所以我的经验是降级策略一定要分接口、分场景、分优先级绝不能一把梭。一个稳妥的做法是核心数据库存、价格、订单状态宁可返回失败或让用户等待也不能给错误数据非核心数据推荐、评论、标签可以返回默认值拉新活动类数据秒杀信息、独享优惠在降级时直接隐藏入口而不是展示错误信息。我通常用一个表格来定义降级矩阵这里也分享给读者参考接口类型降级策略兜底数据核心交易链路库存/订单不降级必要时限流等待无必须保证准确核心数据商品详情/基础信息读过期副本允许短暂不一致非核心数据推荐/榜单/评论返回默认值或空列表展示简化内容功能开关领券/签到/任务直接关闭入口页面隐藏日志与埋点本地暂存、异步上报可丢失5.4 坑四降级把活数据变成死数据业务口径出问题最后一个让我印象最深的坑降级返回了默认值但业务方不知道拿着这个默认值去做了计算和统计。比如某个统计接口降级期间返回了一个兜底的固定数值业务方把当天数据直接用于财务对账结果偏差巨大半夜又被电话吵醒去解释。从那之后我会在降级响应里加一个明显的标识字段类似data_source: degraded并且把降级请求写入独立日志。这样一来无论是监控系统还是下游消费者都能区分正常数据和降级数据避免脏数据被当成真实数据用。这个习惯非常值得养成它虽然不直接提升可用性但能避免一场更大的信任事故。5.5 关于降级的个人建议如果让我给一个刚接手高可用系统的同学一个最直接的建议我会说不要追求一步到位。先把下面三件事做扎实再考虑更花哨的方案。先做开关所有可能出问题的读接口先加一个手动的降级开关确认开关本身随时可控这是 1 分钟就能做完的改动但关键时刻能保命。再做监控给缓存访问加上成功率、延迟、命中率三个基础指标配上告警。没有监控的降级方案等于没有眼睛你会发现自己永远在猜。最后做策略在监控完善的基础上再去做自动降级、分级降级、半开恢复这些机制每一步都能验证有效之后再上线。缓存降级不是那种能拿出去炫耀的炫技功能它更像保险带——平时存在感极低但真出一次事故你就能体会到它值多少钱。希望这篇基于真实踩坑过程写出来的东西能让更多同学在深夜报警电话打来之前就把这道防线筑牢。

相关新闻

Claude外置记忆层:跨会话记忆架构与向量召回实战

Claude外置记忆层:跨会话记忆架构与向量召回实战

很多时候我在本地跑Claude做长期项目时都会遇到同一个尴尬:昨天明明聊得好好的,今天打开新会话,它完全不记得你是谁,也不知道你们之前定过什么方案。上下文窗口再大,也架不住“跨会话失忆”这个硬伤。我为了解决这个问…

2026/10/10 13:12:05 阅读更多 →
NURBS 3.0.11 源码在 VS2010 下的编译调试与避坑指南

NURBS 3.0.11 源码在 VS2010 下的编译调试与避坑指南

简介:Nurbs3.0.11开源库VS2010源代码面向C开发者与计算机图形学、CAD方向的学习者,提供在Windows平台下创建与操作NURBS曲线曲面的完整实现。NURBS凭借非均匀性与权重控制,能精确表达复杂几何形状,该库封装了控制点、权重值、阶数…

2026/10/10 13:12:05 阅读更多 →
电场诱导聚合物微纳图案化:Comsol三物理场耦合仿真指南

电场诱导聚合物微纳图案化:Comsol三物理场耦合仿真指南

第一次把Comsol里那个“静电-层流-移动网格”三物理场耦合模型跑出完整聚合物柱状突起时,我盯着后处理动画反复看了很久。这个标题听起来很长,但落到仿真层面,其实是把一个很经典的微纳制造问题变成了可复现的数值实验:聚合物薄膜…

2026/10/10 13:12:05 阅读更多 →

最新新闻

软件测试面试题全解析:从基础理论到AI与物联网实战

软件测试面试题全解析:从基础理论到AI与物联网实战

软件测试面试题这个话题,每年都能收到一堆私信。有人刷了一周八股文还是挂在一面,有人只准备了两天却拿到了不错的offer。核心区别不在于背了多少题,而在于有没有把题目背后的考察点摸透。我整理了这份软件测试面试常见问题清单,附…

2026/10/10 14:08:50 阅读更多 →
C++ unordered_map与unordered_set详解:哈希表原理、接口用法与性能优化

C++ unordered_map与unordered_set详解:哈希表原理、接口用法与性能优化

用过 C 的都知道,当你还在用map、set做查找和去重的时候,数据量一旦上来,心里多少会有点不踏实。这时候就该unordered_map和unordered_set登场了。这两个容器在 C11 里正式进入标准库,核心卖点就一句话:基于哈希表实现…

2026/10/10 14:08:50 阅读更多 →
Linux新手第一周:环境搭建、常用命令与学习路线全记录

Linux新手第一周:环境搭建、常用命令与学习路线全记录

几个月前,社团面试的场景还在眼前,转眼第一周周报已经躺在群文件里。说实话,接手【西邮 Linux 兴趣小组】的第一周,我最大的感受不是“教了多少东西”,而是“被一群刚接触 Linux 的新人追着问问题,自己回头…

2026/10/10 14:08:50 阅读更多 →
踩坑实录:接进RAG后召回率反而崩了?all-MiniLM-L6-v2的5个隐藏陷阱

踩坑实录:接进RAG后召回率反而崩了?all-MiniLM-L6-v2的5个隐藏陷阱

踩坑实录:接进RAG后召回率反而崩了?all-MiniLM-L6-v2的5个隐藏陷阱 【免费下载链接】all-MiniLM-L6-v2 项目地址: https://ai.gitcode.com/hf_mirrors/sentence-transformers/all-MiniLM-L6-v2 把 all-MiniLM-L6-v2 接进 RAG 管线,几…

2026/10/10 14:08:50 阅读更多 →
2026年AI Agent发展趋势与挑战:从理论到实践的跨越,TaoToken统一Key打通OpenClaw落地链路

2026年AI Agent发展趋势与挑战:从理论到实践的跨越,TaoToken统一Key打通OpenClaw落地链路

/* 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 14:08:50 阅读更多 →
Harness 工程安全基线:为 AI Agent 编写 SECURITY.md 安全策略文件

Harness 工程安全基线:为 AI Agent 编写 SECURITY.md 安全策略文件

【免费下载链接】learn-harness-engineering Harness engineering beginner tutorial, from 0 to 1 项目地址: https://gitcode.com/gh_mirrors/le/learn-harness-engineering 点击查看 免费下载 SECURITY.md 是面向 Agent 的仓库(agent-first reposito…

2026/10/10 14:07:49 阅读更多 →

日新闻

卫星轨道分类全解析:从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/10 11:14:25 阅读更多 →
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/10 11:14: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/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 阅读更多 →