必须用 redis.asyncio 连接池替代 redis.redis,避免阻塞 fastapi 异步事件循环;缓存 key 需包含 method、path、排序后的 query_params 和用户标识;序列化优先用 json.dumps + 自定义 encoder,禁用 pickle;更新数据后须主动删除对应缓存,不可仅依赖 ttl。

用 redis.asyncio 连接池而不是 redis.Redis
同步客户端 redis.Redis 会阻塞整个 FastAPI 的异步事件循环,哪怕只在某个接口里调用一次,也会让其他并发请求卡住。必须用官方内置的异步驱动 redis.asyncio(4.2+ 版本自带,不用额外装 aioredis)。
常见错误现象:RuntimeWarning: coroutine 'Redis.get' was never awaited 或接口响应明显变慢、并发数上不去。
实操建议:
- 安装时确认版本:
pip install redis>=4.2.0 - 连接池初始化用
redis.asyncio.ConnectionPool.from_url(),不是redis.Redis() - 关键参数必须设:
decode_responses=True(避免手动.decode()),max_connections=20(默认只有 10,高并发下容易耗尽),socket_connect_timeout=5和socket_timeout=5 - 不要在每次请求里新建连接——用全局单例或依赖注入管理连接池实例
缓存 key 必须带 query 参数和用户上下文
只用 request.url.path 做 key,会导致不同查询参数(比如 /users?id=1 和 /users?id=2)命中同一个缓存,返回错数据;不区分用户,还会造成 A 用户看到 B 用户的私有数据。
实操建议:
- key 构造要包含:
method+path+sorted(query_params.items())+ (可选)user_id或Authorization头的哈希值 - 别用
str(request.query_params)—— 它顺序不稳定,两次生成的字符串可能不同 - 用
hashlib.md5压缩拼接后的字符串,生成固定长度 key,避免 Redis 报key too long - 示例片段:
f"fastapi:get:/users:{md5(str(sorted_q).encode()).hexdigest()}"
序列化返回值不能用 pickle,优先用 json.dumps + custom encoder
pickle.dumps() 有严重安全隐患(反序列化任意代码)、跨 Python 版本不兼容、且其他语言服务无法读取。FastAPI 接口返回的 Pydantic BaseModel、datetime、UUID 等类型,直接 json.dumps() 会报错。
实操建议:
- 写一个轻量级 encoder 函数,处理常见不可序列化类型:
datetime→ ISO 格式字符串,UUID→str(uuid),BaseModel→.model_dump()(v2)或.dict()(v1) - 缓存写入前:用
json.dumps(data, default=encoder);读取后:用json.loads() - 如果对性能极致敏感,可用
msgpack.packb()替代 JSON,但需确保所有服务端语言都支持解包 - 务必加 try/except 包裹序列化逻辑,失败时直接降级走数据库,别让缓存层崩掉整个接口
缓存更新必须主动清理,不能只靠 TTL
只设 EX 过期时间,会导致「缓存不一致」:数据库已更新,但旧缓存还在,用户看到过期数据,有时长达几分钟甚至更久。
实操建议:
- 在数据变更操作(如
PUT /users/{id})执行成功后,立刻调用redis.delete(key)清理对应缓存 - 批量更新时,用
redis.delete(*keys)或redis.scan_iter("fastapi:get:/users:*")+redis.delete()批量清除 - 对「列表页」这类难精确匹配 key 的场景,可约定命名空间前缀(如
cache:users:list),更新时删整个前缀 - 别依赖「延迟双删」等复杂策略——简单直接的主动删除,在绝大多数业务场景中更可靠、更易维护
最常被忽略的一点是:缓存不是开了就完事,它引入了新的状态一致性边界。你得明确每条缓存的生命周期——谁写、谁读、谁删、什么时候删。漏掉任何一个环节,问题就会在凌晨三点的生产环境准时出现。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











