尧图网络 高端网站定制 · 原创设计
免费咨询热线
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/9/1 1:08:14
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/9/12 18:57:37
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

更多资讯

📰

编程Agent大横评:17款平台分层盘点与选型指南

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

📰

### Oracle(红木海岸)2026年最新动态深度分析报告

作为全球领先的技术供应商,Oracle(甲骨文公司)在2026年迎来了其发展史上最具转折意义的一年。总部位于加州红木海岸的这家科技巨头,正以前所未有的决心和资本投入,从传统的数据库软件供应商向AI云基础设施(…

📰

截至2026年,Apache Tomcat的版本线呈现出清晰的三代并存格局

在2026年的Web开发版图中,Java生态依然占据着企业级应用的核心地位。作为Java Web开发的基石,Apache Tomcat与JavaServer Pages (JSP) 经历了二十余年的演进,其技术形态与应用场景已发生深刻变化。本报告旨在梳理2026年Tomcat与JSP的最新动态…

📰

量化开发如何选对A股数据API?7项硬指标检查清单

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

📰

核心模块批量审查实战:导入导出、链路协议与归档治理

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

📰

车载Android串口通信实战:UART/RS232/RS485与权限排坑

做车载Android开发,串口这块儿迟早要碰。中控屏跟仪表MCU对数据、车机连T-Box、外接传感器、控制摄像头云台,底层链路翻来覆去就是UART、RS232、RS485这三兄弟。很多刚从App开发转过来的朋友,一上来就被“Permission denied”、乱码、A/B线接…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

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

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

📞 💬