Flask-Caching 与 Flask-Limiter 的协作方式

缓存解决重复计算,限流解决滥用;两者都需要明确的失效与降级策略。

Flask-Caching 与 Flask-Limiter 的协作方式

缓存和限流经常被当成「加一行装饰器」的优化,但它们真正考验的是边界设计。

缓存什么

优先缓存「读多写少、计算稳定」的数据:分类列表、标签计数、首页聚合结果。

cached = cache.get("blog:categories")
if cached is None:
    cached = build_categories()
    cache.set("blog:categories", cached, timeout=300)

关键不是 cache.get,而是写操作后必须失效。博客服务在发布、删除、修改分类后统一清理缓存,避免出现「后台改了但前台不变」。

限流限什么

  • 登录、注册、找回密码:防止撞库与邮件轰炸
  • 工具执行接口:防止脚本批量调用
  • 全站默认限流:兜底
@limiter.limit(lambda: current_app.config["TOOL_RUN_LIMIT"])
def run_tool(slug):
    ...

把阈值放进配置,测试环境关闭,生产环境按实际负载调整。

分层配额

全局限流之外,业务层还有「每日免费次数」:访客 10 次、注册用户 50 次、会员不限。两层机制互补:限流挡住瞬时洪峰,配额控制长期成本。

降级策略

缓存不可用时回退到数据库,统计写入失败时回滚事务,都不能影响主流程。