尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
生图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
RELATED

相关推荐

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

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

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

📅 2026/10/4 19:04:50
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/10/5 22:23:08
sdrtrunk 协议解码终极拆解:一场呼叫从天线到扬声器的完整旅程

sdrtrunk 协议解码终极拆解:一场呼叫从天线到扬声器的完整旅程

sdrtrunk 协议解码终极拆解:一场呼叫从天线到扬声器的完整旅程 【免费下载链接】sdrtrunk A cross-platform java application for decoding, monitoring, recording and streaming trunked mobile and related radio protocols using Software Defined Radios (SDR…

📅 2026/9/12 18:40:24
MORE NEWS

更多资讯

📰

不靠游戏引擎,用AI从零开发蚂蚁搬家网页小游戏

最近手痒,又想折腾点游戏。不过这次我给自己定了个规矩:绝不开Unity,绝不碰Godot,连Phaser、PixiJS这种轻量框架都先放一边。就用对话式AI结合网页原生技术,硬生生攒出一款能玩的小游戏来。成品就是标题里说的“蚂蚁搬…

📰

UE实战进阶:Gameplay框架、C++与蓝图边界及渲染管线优化

1. 从"能跑蓝图"到"看懂引擎":为什么第五篇要聊实战与高级主题 很多人学UE(Unreal Engine)的路径都差不多:先跟着教程拖几个Actor,连一堆蓝图节点,做出个能跑能跳的小人,然…

📰

.NET超市管理系统开题答辩实战:选题、设计与高频问题解析

又到了毕业设计开题的季节,后台收到不少同学私信问“开题答辩到底怎么准备”“老师会问什么问题”。我当年选的就是“基于.NET的超市管理系统设计与实现”这个题目,从选题到开题答辩,再到后面上线跑通,整个过程踩过不少坑&#xf…

📰

UE实战进阶:从蓝图到C++的Gameplay框架与渲染管线工程化指南

1. 从零拆解UE实战:为什么“引擎会用”和“引擎用得好”是两回事很多人第一次打开Unreal Engine,是被它那套“所见即所得”的编辑器吸引的。拖一个立方体进去,加个材质,放个光源,点一下播放,画面就出来了。…

📰

鸿蒙应用崩溃监控实战:团结引擎接入Sentry与符号化还原C#行号

做鸿蒙应用开发的人应该都有这种体验:本地模拟一切正常,一上真机就闪退,手里只有一个十六进制地址,连哪个函数崩的都看不出来。我这次折腾的,就是给团结引擎(Tuanjie Engine,熟悉 Unity 的人可以…

📰

PyCharm控制台pip install后仍报ModuleNotFoundError的完整排查与解决

关于 PyCharm 控制台 pip install 之后仍然报 ModuleNotFoundError: No module named flask 的完整排查记录 先说场景:你在 PyCharm 底部那个 Terminal 面板里敲了 pip install flask ,看着进度条跑完、 Successfully installed flask-3.x.x 也打出来…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬