二维码生成和识别:图片每 12 小时清理,如何设计保存与缓存策略
# 二维码生成和识别:图片每 12 小时清理,如何设计保存与缓存策略
> 接口/接入点:二维码生成和识别(apiCode=887,生成接入点 887-1)· 是否免费:是 · 返回格式:JSON · 适用人群:已上生产的开发者、架构师 · 阅读时间:约 5 分钟
## 核心要点
- 生成图存 ShowAPI 服务器,**每 12 小时删除数据**,必须生成即下载到自有存储。
- 推荐链路:生成 → 立即下载 → 存对象存储(OSS)/本地 → CDN 加速访问。
- 相同 content 可缓存复用,避免重复调用与重复出图。
## Why:不保存,二维码迟早"打不开"
很多团队把 `imgUrl` 直接写进数据库、前端长期展示,结果用户一周后扫码发现图 404——因为图已被清理。这条边界是生产事故高发点,必须前置处理。
## What:保存时效事实
| 项 | 说明 |
|----|------|
| 存储位置 | ShowAPI 服务器(非你的存储) |
| 清理周期 | 每 12 小时删除 |
| 你的责任 | 生成后及时下载并落盘到自有存储 |
> 来源:生成接入点说明"图片存放于 showapi 服务器,可能不定期清理,建议及时保存"及"每 12 个小时删除数据"。
## How:生成即落盘(Python + 对象存储思路)
```python
import requests, hashlib
API = "https://route.showapi.com/887-1"
APPKEY = "YOUR_APPKEY"
def ensure_qr(content):
# 1) 先查本地缓存(相同 content 复用)
key = hashlib.md5(content.encode()).hexdigest()
cached = local_cache_get(key)
if cached:
return cached # 自有存储地址
# 2) 调用生成
resp = requests.post(API, params={"appKey": APPKEY},
data={"content": content}, timeout=10)
body = resp.json()["showapi_res_body"]
if body.get("ret_code") != "0":
raise RuntimeError(body.get("msg"))
# 3) 立即下载并落盘到自有存储(OSS/本地),切勿只存 imgUrl
img = requests.get(body["imgUrl"], timeout=10).content
own_url = oss_upload(img, f"qr/{key}.png") # 伪函数:上传到你的对象存储
local_cache_set(key, own_url)
return own_url
```
```bash
# 单条:生成后顺手下载
URL=$(curl -s "https://route.showapi.com/887-1?appKey=YOUR_APPKEY" \
-d "content=https://a.com" | python -c "import sys,json;print(json.load(sys.stdin)['showapi_res_body']['imgUrl'])")
curl -s "$URL" -o qr.png
```
## 缓存设计建议
| 层 | 作用 | 实现 |
|----|------|------|
| 生成缓存 | 相同 content 不重复调用 | 以 content 的 md5 为 key,存自有地址 |
| 对象存储 | 持久保存图片 | OSS / S3 / 本地磁盘 |
| CDN | 加速访问、减负源站 | 绑定自定义域名 |
| 数据库 | 记录 content↔own_url 映射 | 便于回溯与更新 |
## 进阶 / 边界
- **不要只存 imgUrl**:12h 后失效。落盘到自有存储才是"永久"方案。
- **内容变更**:content 变了就是新二维码,按新 key 重新生成,旧图可保留或过期清理。
- **批量场景**:见[批量生成全链路](https://www.showapi.com/guides/qrcode-batch-generate-887),生成即下载。
## FAQ
**Q1:图片能一直放在 ShowAPI 吗?**
A:不能,每 12h 清理。生产必须下载到自有存储。
**Q2:同一个 content 重复生成会出一样的图吗?**
A:内容相同则二维码信息相同;可缓存复用,减少调用。
**Q3:本地缓存 key 用什么?**
A:用 content 的哈希(如 md5)即可,相同内容命中缓存。
**Q4:下载失败怎么办?**
A:下载属自有存储写入,失败需重试;建议生成与下载放在同一事务/重试链路里。
## 相关能力 / 下一步阅读
- [二维码生成和识别:批量生成二维码的全链路设计](https://www.showapi.com/guides/qrcode-batch-generate-887)
- [二维码生成和识别:10 个实战避坑清单(100KB 上限 / 12h 清理 / 格式)](https://www.showapi.com/guides/qrcode-best-practices-887)
- [二维码生成和识别:5 分钟接入,从注册到生成第一个二维码](https://www.showapi.com/guides/qrcode-quickstart-887)
- **本系列共 12 篇**:查看[二维码生成和识别指南总目录](https://www.showapi.com/guides/qrcode-guides-887)