0

0

Python 速率限制中间件的多维度实现

舞夢輝影

舞夢輝影

发布时间:2026-02-20 12:05:22

|

828人浏览过

|

来源于php中文网

原创

不够,因为lru_cache仅缓存返回值,不支持时间窗口、用户区分、请求阻塞及跨进程限流,真实场景需redis等外部存储实现状态一致性。

python 速率限制中间件的多维度实现

functools.lru_cache 做内存级速率限制够吗?

不够,除非你只跑单进程且请求量极低。它本质是函数调用缓存,不是限流——不区分用户、不计时间窗口、不阻塞超限请求,更不会返回 429 Too Many Requests。常见错误是把它当 rate_limit 用,结果压测时直接绕过限制。

  • 真实限流必须带「时间窗口」和「计数器」逻辑,比如每分钟最多 100 次
  • lru_cache 缓存的是返回值,不是「是否允许通过」的决策
  • 多进程下各进程有独立缓存,完全失效;用 threading.Lock 补也解决不了跨进程问题
  • 如果只是防自己写脚本误刷,那它凑合;但要防真实用户或爬虫,必须换方案

FastAPI 里怎么加 Redis 支持的限流中间件?

核心是拦截请求、查 Redis 计数、超限就中断。别自己手写连接池和 Lua 脚本,用 slowapifastapi-limiter 更稳。

  • 推荐 fastapi-limiter:它封装了 aioredis(v2)或 redis-py(v4+),自动处理连接复用和原子计数
  • 初始化时必须传 redis 实例,不是 URL 字符串:await limiter.init(redis)
  • 限流装饰器要放在路由函数上,不是中间件里——中间件没提供 request.state 的干净入口点
  • 注意 key_func 参数:默认按路径限流,想按用户 IP 限,得写 lambda request: request.client.host
  • 错误现象:Redis 连接失败时默认静默放行,需手动检查 await limiter.get_connection() 并抛异常

Django 中间件里用 django-redis 实现滑动窗口限流要注意什么?

滑动窗口比固定窗口更准,但实现稍重。别用 zset 存所有时间戳——高频场景下会拖慢 Redis。

轩宇淘宝客系统
轩宇淘宝客系统

轩宇淘宝客是一款适用于淘宝客打折单品推广的程序,无论老手或新手都能短时间内赚取大量佣金的淘宝客网站程序,不同于现在广泛的淘宝客推广网站。本程序可手动添加商品,同时也配置强大的多功能采集插件,可采集评论,也可自定义采集规则,全自动无人值守采集更新网站,无需人工维护。默认提供精美的页面设计模版,超好的用户访问体验,超高转化率。对搜索引擎收录友好,整站伪静态技术,访问速度快,无需等待漫长的生成HTML页

下载
  • ZREMRANGEBYSCORE 清旧数据必须紧跟在 ZCARD 前,否则并发时可能漏删
  • 单次请求的 key 要带毫秒级时间戳,比如 f"rate:{ip}:{int(time.time() * 1000)}",不然窗口对不齐
  • django-redisget_client() 返回的是连接池实例,别每次 new 一个新连接
  • 性能坑:如果用 cache.set(key, 1, timeout=60) 模拟窗口,实际是固定窗口,且无法做「当前窗口内已多少次」的精确查询
  • 示例判断逻辑:if await redis.zcard(key) >= limit and await redis.zcount(key, now - window_ms, now) >= limit:

为什么用内存字典 + time.time() 实现的限流上线就崩?

因为没处理并发竞争和内存泄漏。看似简单,实则陷阱密集。

立即学习Python免费学习笔记(深入)”;

  • 多线程下 dict 非线程安全,counter[uid] += 1 不是原子操作,会丢计数
  • 时间窗口清理靠定时任务?Python 没可靠后台线程,Gunicorn 多 worker 下每个进程都得跑一份,极易错乱
  • key 不设 TTL,字典无限增长,OOM 是早晚的事
  • 正确做法:至少加 threading.RLock,且每个 key 必须配 last_clean_time 字段,每次访问前检查并清理过期项
  • 更现实的选择:直接上 redismemcached,本地内存只适合开发调试

限流的复杂点不在算法本身,而在「状态一致性」——跨进程、跨机器、网络分区、Redis 故障降级,这些边界情况一旦漏掉,线上就是 429 泛滥或者形同虚设。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

96

2026.02.04

什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

180

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

224

2025.12.18

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

28

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

223

2026.02.06

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

822

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

594

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

217

2023.09.04

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

776

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号