FastAPI 性能扩展 Redis 缓存、Celery 异步任务与容器部署
任务详情接口被频繁刷新时数据库其实在重复回答同一个问题。把所有耗时工作都塞进 FastAPI 请求里也会出事用户点一次导出浏览器就一直转圈。这一篇给任务 API 加两条分流Redis 负责短暂记忆Celery 负责把耗时工作交给 worker。配套代码已经放在 fastapi-task-api文章中的完整实现以main分支为准。Redis 不是越早接越好缓存会带来失效问题所以项目只缓存一个最容易定义边界的对象任务详情。列表带分页和筛选条件缓存键会迅速膨胀先不碰它。defcache_key(owner_id:uuid.UUID,task_id:uuid.UUID)-str:returnftask:{owner_id}:{task_id}router.get(/{task_id},response_modelTaskRead)asyncdefread_task(task_id:uuid.UUID,sessionDepends(get_db_session),redisDepends(get_redis)):keycache_key(current_user.id,task_id)cachedawaitredis.get(key)ifcached:returnTaskRead.model_validate_json(cached)taskawaitowned_task(session,task_id,current_user.id)resultTaskRead.model_validate(task)awaitredis.set(key,result.model_dump_json(),ex300)# 缓存五分钟returnresult键里必须有用户 ID。即使任务 UUID 已经很难猜隔离条件也不能依赖运气。更新和删除任务后立刻删键下一次读取自动回源数据库。创建接口没有对应缓存因此不需要做任何操作。awaitsession.commit()awaitredis.delete(cache_key(current_user.id,task_id))缓存的正确性来自失效策略不来自缓存命中率。这就是为什么这里只放详情不拿 Redis 去替代数据库。BackgroundTasks 和 Celery 各干什么FastAPI 的BackgroundTasks适合短小、允许跟 Web 进程同生共死的事情例如记录一条审计日志。它不需要单独部署 worker。Celery 则把任务投给 broker由独立 worker 消费。导出 CSV、批量发邮件、调用慢速第三方接口都更适合这个路径。worker 可独立扩容也能配置重试。任务 API 用 Redis 同时充当 broker 和结果后端。场景选择写一条轻量审计日志BackgroundTasks导出任务 CSVCelery批量处理、失败重试Celery需要立即返回计算结果普通async接口把导出变成异步工作提交导出时接口立即返回202和task_id。客户端再用这个 ID 查询状态。为了避免任何登录用户猜到 ID 后读取结果项目把任务所有者短暂记录在 Redis 里。router.post(/exports/tasks,status_code202)asyncdefqueue_export(redisDepends(get_redis),current_userDepends(get_current_user)):resultexport_user_tasks.delay(str(current_user.id))awaitredis.set(fexport-owner:{result.id},str(current_user.id),ex3600)return{task_id:result.id,status:PENDING}worker 内部重新开数据库会话读取该用户的任务再生成 UTF-8 CSV 字符串。不要把 HTTP 请求里的 SQLAlchemy session 传给 Celery它无法跨进程序列化。celery_app.task(bindTrue,autoretry_for(Exception,),retry_backoffTrue,max_retries3)defexport_user_tasks(self,user_id:str)-str:returnasyncio.run(build_csv(uuid.UUID(user_id)))autoretry_for只适合可重试的临时失败例如数据库短暂不可用。CSV 格式错误或无效用户这类确定性错误重试三次也不会变好。大文件也不该塞进结果后端真实项目应该上传对象存储结果只返回下载地址。Celery WorkerRedisFastAPIClientCelery WorkerRedisFastAPIClientPOST 导出投递任务和保存所有者202 task_idworker 消费任务写入结果状态GET 导出状态PENDING 或 SUCCESS用 Docker Compose 把四个服务放到一起本地起 API 还不难真正容易遗漏的是 worker、PostgreSQL 和 Redis 的连接配置。docker-compose.yml定义四个服务PostgreSQL 和 Redis 有健康检查API 等数据库健康后先执行alembic upgrade head再启动。Copy-Item.env.example.env docker compose up--build.env中的DATABASE_URL主机名是postgresREDIS_URL主机名是redis它们来自 Compose 服务名。启动成功后打开/docs先注册、登录复制 Bearer 令牌再创建任务和提交导出。这一套配置不是高可用方案。生产环境还要接日志、指标、备份、密钥管理和外部对象存储。但 API、数据库、缓存和 worker 已经各自有了明确位置后续扩展不会全挤在 Web 进程里。本篇收口Redis 只缓存任务详情更新和删除时精确失效Celery 处理可延迟的 CSV 导出并返回可查询的任务 ID导出任务的所有者映射阻止其他用户读取结果Docker Compose 统一启动 API、PostgreSQL、Redis 与 worker

相关新闻

手把手教你用Ollama本地部署Qwen3.5-9B大模型:从GGUF量化到WebUI实战

手把手教你用Ollama本地部署Qwen3.5-9B大模型:从GGUF量化到WebUI实战

最近在本地部署大模型时,发现了一个“宝藏”模型——Qwen3.5-9B。它不仅在推理、代码、数学等多项基准测试中表现出色,更关键的是,通过特定的量化格式(如GGUF)和工具(如Ollama)部署后&#xff0…

2026/10/18 23:47:52 阅读更多 →
终极Windows驱动管理神器:DriverStore Explorer完整指南,轻松释放数GB磁盘空间

终极Windows驱动管理神器:DriverStore Explorer完整指南,轻松释放数GB磁盘空间

终极Windows驱动管理神器:DriverStore Explorer完整指南,轻松释放数GB磁盘空间 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否发现Windows系统盘空间日益…

2026/10/19 0:25:08 阅读更多 →
如何用OpenCascade.js在浏览器中实现专业级3D CAD建模:完整指南

如何用OpenCascade.js在浏览器中实现专业级3D CAD建模:完整指南

如何用OpenCascade.js在浏览器中实现专业级3D CAD建模:完整指南 【免费下载链接】opencascade.js Port of the OpenCascade CAD library to JavaScript and WebAssembly via Emscripten. 项目地址: https://gitcode.com/gh_mirrors/op/opencascade.js 想要在…

2026/10/17 6:15:49 阅读更多 →

最新新闻

Docker跑Oracle XE 11g数据持久化完整指南:从踩坑到稳定方案

Docker跑Oracle XE 11g数据持久化完整指南:从踩坑到稳定方案

Docker跑Oracle XE 11g这事,说简单也简单,docker pull一下、docker run一条命令就能把数据库跑起来,开发环境、演示环境、本地学习都很方便。但说坑也是真坑,尤其是数据持久化这一块——只要你把数据写在容器里面,哪天…

2026/10/19 6:05:39 阅读更多 →
OpenClaw 生产级部署实战:从高可用架构到安全加固

OpenClaw 生产级部署实战:从高可用架构到安全加固

聊一个我最近反复折腾的话题:OpenClaw 的生产级部署。如果你只是想在本地把 OpenClaw 跑起来验证功能,那一条 docker run 就够了,顶多再配个环境变量。但一旦要放到正式环境里,事情就完全变味了——服务要扛得住流量波动&#xff…

2026/10/19 6:05:39 阅读更多 →
单目三维重建实战:Python+OpenCV从标定到点云

单目三维重建实战:Python+OpenCV从标定到点云

简介:这份基于Python的单目三维重建项目源码与文档说明,主要面向计算机、通信、人工智能、自动化等相关专业的本专科学生、教师或从业者,可支撑毕业设计、期末课程设计及项目实战。完整包共12个文件,含Python主程序、Markdown说明…

2026/10/19 6:05:39 阅读更多 →
读懂A股大宗交易:从折价率到营业部的资金预警指南

读懂A股大宗交易:从折价率到营业部的资金预警指南

我第一次认真打开大宗交易数据页面,是在一次股价暴跌之后。当时某只股票盘中走势还算正常,结果收盘后我看到一条大宗交易记录:成交价比当天收盘价低了将近8%,卖方营业部在半个月里反复出现。我没太当回事,直到这只股票…

2026/10/19 6:05:39 阅读更多 →
R语言机器学习工作流实战:从散装脚本到多算法统一实现

R语言机器学习工作流实战:从散装脚本到多算法统一实现

简介:这份资源面向具备一定统计基础、希望用R语言落地机器学习算法的数据分析人员与学生,围绕监督学习与非监督学习两条主线,提供可直接运行的算法实现代码。包内共20个文件,以8个R脚本和6个CSV数据集为主,另含LICENSE…

2026/10/19 6:05:39 阅读更多 →
基于Spring Boot的奖学金评定管理系统设计与实现要点

基于Spring Boot的奖学金评定管理系统设计与实现要点

做毕设选题目的时候,奖学金评定管理系统这东西看着不起眼,真做起来门道不少。它不像电商秒杀那样有高并发噱头,也不像推荐系统那样能晒算法,但胜在业务流程完整——学生申请、辅导员初审、评审打分、结果公示、数据导出&#xff0…

2026/10/19 6:04:38 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

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

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/18 12:16:16 阅读更多 →