中转平台Redis缓存模型回复,降低上游调用成本实践

中转平台如果每次都直接请求上游大模型 API,相同问题也会重复计费,费用高不说,响应还慢。
本文将带你用 Redis 缓存模型回复,把相同参数的请求直接命中缓存,跳过上游调用,从而降低上游调用成本、提升响应速度。
你只需要一台装了 Redis 的服务器和一段可改动的中转服务代码,跟着操作即可落地。

哪些中转场景最适合做缓存

缓存不是万能药,先确认你的业务是否匹配:

  • 用户重复提问相似问题,比如常见咨询、知识问答、固定格式生成。
  • 同一套 model + messages + temperature 组合会被多次请求。
  • 上游按 token 计费,且对相同结果没有强制实时性要求。

如果你的平台大量请求都是随机对话、内容每次都不同,缓存收益会很低;
如果存在明显热点词或重复固定 prompt,缓存就能大幅节省成本。

落地前需要准备什么

  • Redis 服务:建议 6.x 以上,确保支持 SETEX、NX 等基础命令。
  • 中转服务代码:不管你是用 Python、Node.js 还是 Go,只要能读取请求参数和返回结果即可。
  • 上游 API 密钥:继续保留原有调用逻辑,缓存只作为前置拦截。

准备好后,先确认 Redis 连接正常:

redis-cli -h 127.0.0.1 -p 6379 ping

返回 PONG 就表示连接可用。

核心实现:写一个带缓存的中转请求逻辑

这里以 Python 为例,演示如何按请求参数生成缓存 key,并在命中缓存时直接返回。

import hashlib
import json
import redis

r = redis.Redis(host='127.0.0.1', port=6379, db=0, decode_responses=True)
CACHE_TTL = 3600  # 缓存1小时,按业务调整

def build_key(model, messages, temperature):
    raw = json.dumps({
        "model": model,
        "messages": messages,
        "temperature": temperature
    }, ensure_ascii=False, sort_keys=True)
    return "llm:reply:" + hashlib.md5(raw.encode("utf-8")).hexdigest()

def get_model_reply(model, messages, temperature=0.7):
    key = build_key(model, messages, temperature)
    cached = r.get(key)
    if cached:
        return json.loads(cached)  # 已缓存,直接返回

    # ---------- 原有上游调用代码 ----------
    # 这里替换为你的真实请求逻辑,例如 openai.ChatCompletion.create(...)
    # reply = upstream_request(model, messages, temperature)
    # ------------------------------------
    
    reply = "模拟的模型回复内容"  # 实际请使用上游返回值

    # 只缓存成功回复,避免错误结果被复用
    if reply:
        r.setex(key, CACHE_TTL, json.dumps(reply, ensure_ascii=False))
    return reply

关键点:缓存 key 必须把影响输出结果的参数全部放进去,包括 model、完整的 messages、temperature、max_tokens 等。
忽略任何一项,都可能让不同请求拿到错误缓存。

避坑:缓存穿透、击穿和一致性

不要缓存错误响应。
上游返回 4xx、5xx 或空内容时,应该直接放行或做短时间内熔断,不能把错误结果存进 Redis。

避免缓存穿透。
大量请求携带的 key 不存在时,会全部打到上游。
可以为空结果设置极短 TTL(比如 60 秒),或加布隆过滤器。

避免缓存击穿。
某个热点 key 过期瞬间,并发请求会同时穿透到上游。
建议用 Redis SETNX 加锁:

import time

def acquire_lock(key, timeout=10):
    lock_key = key + ":lock"
    result = r.set(lock_key, "1", nx=True, ex=timeout)
    return result

# 在缓存未命中时,先抢锁,抢到才请求上游,抢不到则等待后重读缓存

一致性怎么处理。
如果上游模型有更新版本,你可以把版本号拼进 key,比如 llm:reply:v2:;
或者直接清空对应前缀的缓存。
普通场景下设置合理 TTL 就够了。

验证成本是否真的降下来

上线后不要只看 Redis 内存,要关注三层指标:

  • 上游调用数:在日志里统计同一时间段内真实发往上游的请求数,和总请求数对比,计算缓存命中率。
  • 响应耗时:命中缓存的请求通常在 10ms 内返回,远低于上游的 1-3 秒,用监控工具对比平均耗时。
  • 费用变化:通过上游 console 查看 token 消耗,看相同业务量下费用是否明显下降。

如果命中率低于 30%,说明你的请求多样性强,可以考虑调整 key 的粒度,比如只缓存 system prompt 固定的知识问答,而不是全部请求。

两个常见疑问

缓存回复会不会导致用户看到旧答案? 会,所以 TTL 不要设置过长。对时效性敏感的场景,建议 TTL 设为 300-1800 秒,或提供强制刷新参数跳过缓存。
多轮对话怎么缓存? 直接把整个 messages 数组作为 key 的一部分,只有上下文字符串完全一致才命中。你也可以只缓存单轮问答,多轮不做全量缓存。

按这套思路落地后,遇到 Redis 内存暴涨、命中率低或回复串号等问题,先检查 key 是否包含了所有影响输出的参数,再排查 TTL 和淘汰策略。
如果你正在处理中转平台 Redis 缓存模型回复降本,建议先从一个小范围的热点请求开始验证,确认稳定后再逐步放开缓存范围。

分享到:
上一篇
AI中转业务合规风险梳理,日志留存、用户协议
下一篇
Gemini接口报错403 quota exceeded
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意