mirror of
https://gitcode.com/JianFeeeee/ModelRouter.git
synced 2026-11-07 09:47:23 +00:00
理由:本插件里已经有多处**各自手写**的"带冷却的缓存"与"串行"逻辑 (远端目录闸门、余额 60s 缓存、登录轮询…)。手写版本各写各的,边界条件容易漏 —— 本轮就漏了一个(见下)。集中一处才好审。 已把余额缓存改用 ttlCacheGet(消掉手写的 60s 逻辑)。 ★ 抽出来立刻验证出价值 —— 实测踩到一个边界: **清缓存时必须一并清掉"在飞标记"**。否则「清缓存 → 同一秒内重载 → 被去重逻辑 挡住 → 返回 nil」,调用方看到的是"刚清了缓存却拿不到值",而数据其实好好的。 (改动窗口后立即查余额就得到 nil,就是这个。)失效的语义是"忘掉这次加载", 在飞标记也是这次加载的一部分。 另外两条语义也写进注释与判据: - **失败不缓存**:loader 返回 nil 时不写缓存(让下次能重试),但记在飞标记 防止同一瞬间重复打。这与"失败进冷却"是两件事(冷却由调用方决定)。 - **墙钟回拨防护**:`cached_at` 在未来时视为已过期,而不是"还没到" —— 回拨一天会让缓存永远命中、上游改了也自愈不了。 Lua 无协程 ⇒ 做不了"共享同一个 Promise"也做不了"排队等待"。取舍: - 去重用**时间戳**(in_flight_at 短窗口)等价实现; - 串行锁只能做到**互斥 + 让路**(抢不到立刻返回,由调用方跳过本次), 且必须带 **TTL 自解**(持有者崩了不能永久卡死该 namespace)。 判据 `TestTtlCacheSemantics` 四组:命中缓存不重载、**失效后同一秒内能重载**、 ttl=0 每次重载、串行锁"抢到→抢不到→释放后能再抢"。 回归:9 个包全绿。