生图API 怎么避免重复计费?加一层结果缓存和请求去重(nano-banana-pro 实践)
有个月对账我发现出图次数比预期高了三成。查下来原因很蠢同样的提示词被重复调用了。重复是怎么产生的三个来源都很常见一、用户手抖。生成按钮点了没反应其实在跑用户又点一次两个一模一样的请求同时打出去。二、重试打偏。网络超时触发重试但服务端其实已经生成成功了只是响应没回来。重试等于又生成一张。三、批量任务重跑。跑到一半挂了重跑的时候没有断点前面成功的那些又生成了一遍。三种加起来浪费的比例相当可观。解法一个 key 管两件事给每次请求算一个内容指纹用它同时做缓存和去重。const crypto require(crypto); function fingerprint({ model, prompt, aspect, size, refImage }) { return crypto.createHash(sha256) .update(JSON.stringify({ model, prompt, aspect, size, refImage: refImage || })) .digest(hex); }关键是把所有影响出图结果的参数都算进去。漏掉aspect_ratio的话同一句提示词出方图和长图会撞成同一个 key取到错的缓存。缓存 在途去重const cache new Map(); // fp - 结果 const inflight new Map(); // fp - 正在跑的 Promise async function genImage(params) { const fp fingerprint(params); // 1) 已经生成过直接返回 if (cache.has(fp)) return cache.get(fp); // 2) 正在生成中复用同一个 Promise —— 这一步挡住了「用户连点两次」 if (inflight.has(fp)) return inflight.get(fp); const p callGenApi(params) .then((r) { cache.set(fp, r); return r; }) .finally(() inflight.delete(fp)); inflight.set(fp, p); return p; }inflight这层比缓存还重要。缓存只能挡住已经跑完的重复而用户连点、并发重试制造的是同时发出的重复——那时候缓存里什么都没有只有在途表能挡住。什么时候不该走缓存得留一个绕过缓存的口子否则用户会困惑我就是想换一张为什么每次都给我同一张。async function genImage(params, { noCache false } {}) { if (noCache) return callGenApi(params); // ... }界面上的「重新生成」按钮走noCache: true正常路径走缓存。持久化内存 Map 重启就没了批量任务重跑的场景挡不住。生产上建议落到 Redis 或数据库key指纹value图片地址 生成时间TTL按图床的链接有效期定别缓存得比链接还久该服务返回的是图片链接如果你把图转存到了自己的存储缓存里存自己的地址就不用担心过期问题。上线之后重复调用基本归零那三成的额外消耗省下来了。顺带的好处是用户体验变好了连点两次不会等两倍时间第二次直接复用第一次的结果秒返回。这类优化投入很小——核心逻辑就上面那二十来行——但账单和体验都能立刻看到变化属于性价比很高的一类活。接口服务甜甜圈APIdashengfenshen.cn

相关新闻

微信生态集成Claude Code:AI编程助手实战指南

微信生态集成Claude Code:AI编程助手实战指南

1. 项目背景:当微信遇上Claude Code最近在开发者圈子里流传着一个有趣的现象:不少技术团队不再满足于简单调用微信API开发常规功能,而是开始尝试将Claude Code这类AI编程助手深度集成到微信生态中。这让我想起五年前微信小程序刚推出时的场景…

2026/11/16 3:04:39 阅读更多 →
Django 全栈组件框架 Tetra 快速上手:4 步跑通第一个交互组件

Django 全栈组件框架 Tetra 快速上手:4 步跑通第一个交互组件

Django 全栈组件框架 Tetra 快速上手:4 步跑通第一个交互组件 【免费下载链接】tetra Tetra - A full stack component framework for Django using Alpine.js 项目地址: https://gitcode.com/gh_mirrors/tetra/tetra 假设你正在用 Django 做一个后台管理页面…

2026/11/16 3:04:39 阅读更多 →
5 分钟搞定 Windows 与 Office 激活:KMS_VL_ALL_AIO 一键激活终极指南

5 分钟搞定 Windows 与 Office 激活:KMS_VL_ALL_AIO 一键激活终极指南

5 分钟搞定 Windows 与 Office 激活:KMS_VL_ALL_AIO 一键激活终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 上个月帮表哥修电脑,重装完系统正要收工&#xff0…

2026/11/14 1:16:42 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/15 5:13:35 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/15 5:13:35 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/15 5:13:35 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/15 3:37:41 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/15 4:18:38 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/15 5:13:35 阅读更多 →

日新闻

周新闻

月新闻