高效与高并发API开发:使用FastAPI与Redis实现请求限制与速率控制
高效与高并发API开发:使用FastAPI与Redis实现请求限制与速率控制
📚 目录
- API速率限制的基本概念
- Redis实现分布式速率限制
- 防止DDoS攻击的常见策略
- 基于IP或用户身份的访问频率控制
1. API速率限制的基本概念
API速率限制(Rate Limiting)是控制用户访问API的请求速率的一种机制,防止系统被过多请求淹没。通过对用户的请求进行计数与限制,API能够在高并发情况下维持性能与稳定性。
速率限制的主要目的是:
- 防止过多请求导致服务器负载过高。
- 限制恶意或非正常行为,如暴力破解、爬虫攻击等。
- 提高API的可用性,确保公平分配资源。
常见的速率限制算法
-
漏桶算法(Leaky Bucket Algorithm)
漏桶算法在一定时间窗口内以固定速率处理请求,若请求速率超过预定限度,则会被丢弃或延迟。 -
令牌桶算法(Token Bucket Algorithm)
令牌桶算法是一种灵活的速率控制机制,适合处理突发流量。每个请求都需要获取一个令牌,如果令牌桶为空,则请求被丢弃。 -
固定窗口计数法(Fixed Window Counter)
在固定时间窗口内,计数器记录请求的次数,一旦请求超出限制,后续请求将被拒绝。 -
滑动窗口计数法(Sliding Window Counter)
滑动窗口比固定窗口更加精细,每个请求都在一个滑动的时间窗口内进行计数,能平滑流量控制。
通过这些算法,API能够控制不同用户或客户端在指定时间内发起的请求数量,确保系统的平稳运行。
2. Redis实现分布式速率限制
Redis是一个高性能的键值数据库,广泛用于缓存、消息队列和分布式速率限制等场景。在分布式系统中,Redis提供了高效的数据存储和共享机制,可以帮助不同服务器实例共享请求计数信息,从而实现跨服务器的速率限制。
Redis的实现思路
我们使用Redis的SETEX
命令设置一个键值对,其中键为用户标识(例如IP或用户ID),值为请求计数。每次用户发起请求时,我们先检查该键是否存在。如果存在,检查其值是否超过限额;如果不存在,设置新的键并开始计数。通过设置键的过期时间,可以实现速率限制。
示例代码
from fastapi import FastAPI, Request, HTTPException
import redis
import timeapp = FastAPI()# 连接Redis服务器
r = redis.Redis(host='localhost', port=6379, db=0)# 限制参数
LIMIT = 100 # 每分钟100次请求
TIME_WINDOW = 60 # 1分钟@app.middleware("http")
async def rate_limit(request: Request, call_next):ip_address = request.client.hostcurrent_time = int(time.time())# 构造Redis的键redis_key = f"rate_limit:{ip_address}:{current_time // TIME_WINDOW}"# 使用Redis的INCR命令增加计数request_count = r.incr(redis_key)if request_count == 1:# 设置过期时间为60秒(时间窗口大小)r.expire(redis_key, TIME_WINDOW)if request_count > LIMIT:raise HTTPException(status_code=429, detail="Too many requests")response = await call_next(request)return response
代码解析
r.incr(redis_key)
:Redis的INCR
命令可以原子性地递增键的值。如果键不存在,它会先创建键并设置初值为1。r.expire(redis_key, TIME_WINDOW)
:设置键的过期时间,使得计数在每个时间窗口内自动重置。429 Too Many Requests
:当请求次数超过限制时,返回429状态码表示超出请求频率限制。
这种方式可以有效防止单个IP地址在短时间内发送过多请求,保障API的可用性与性能。
3. 防止DDoS攻击的常见策略
DDoS(Distributed Denial of Service)攻击通过大量恶意请求淹没目标服务器,导致系统不可用。为了防止这种攻击,除了传统的防火墙和负载均衡策略外,我们还需要在API层面实现防护。
常见的防御策略
-
IP黑名单/白名单
基于IP的访问控制可以有效阻止已知攻击源的流量。通过将恶意IP加入黑名单,可以防止这些IP的请求进入系统。 -
请求速率限制
利用速率限制算法(如漏桶或令牌桶),控制请求频率,避免单个来源发送过多请求。 -
行为分析与智能防护
通过分析请求的行为模式,识别并阻止异常流量。例如,检测异常的请求头、请求频率、请求路径等。 -
验证码与身份验证
在用户请求的关键环节,如登录、注册、支付等,加入验证码或二次身份验证,防止恶意机器人自动化攻击。
示例代码:基于IP的速率限制和验证码
from fastapi import FastAPI, HTTPException, Request
from fastapi.responses import JSONResponse
from pydantic import BaseModel
import redis
import time
import randomapp = FastAPI()r = redis.Redis(host='localhost', port=6379, db=0)
LIMIT = 100
TIME_WINDOW = 60
CAPTCHA_THRESHOLD = 10@app.post("/login")
async def login(request: Request, user: BaseModel):ip_address = request.client.hostcurrent_time = int(time.time())redis_key = f"rate_limit:{ip_address}:{current_time // TIME_WINDOW}"request_count = r.incr(redis_key)if request_count == 1:r.expire(redis_key, TIME_WINDOW)if request_count > LIMIT:# 启动验证码机制captcha = random.randint(1000, 9999)return JSONResponse(content={"captcha_required": True, "captcha": captcha}, status_code=400)return {"message": "Login successful"}
代码解析
- 当请求频率超过限制时,返回一个验证码,用户需要通过验证码验证来继续操作。
- 这种方式有效阻止了自动化攻击,减少了恶意请求的成功率。
4. 基于IP或用户身份的访问频率控制
除了全局的速率限制外,还可以根据IP地址或用户身份来单独限制访问频率。通过这种方法,可以更精细化地控制API的访问权限,避免某个特定用户或IP占用过多资源。
示例代码:基于用户身份的访问频率控制
from fastapi import Depends, HTTPException, Request
from pydantic import BaseModel@app.get("/user_dashboard")
async def user_dashboard(user_id: str, request: Request):user_limit_key = f"user:{user_id}:rate_limit"ip_limit_key = f"ip:{request.client.host}:rate_limit"# 用户访问频率限制user_request_count = r.incr(user_limit_key)if user_request_count == 1:r.expire(user_limit_key, TIME_WINDOW)if user_request_count > LIMIT:raise HTTPException(status_code=429, detail="User request limit exceeded")# IP访问频率限制ip_request_count = r.incr(ip_limit_key)if ip_request_count == 1:r.expire(ip_limit_key, TIME_WINDOW)if ip_request_count > LIMIT:raise HTTPException(status_code=429, detail="IP request limit exceeded")return {"message": "Welcome to the user dashboard"}
代码解析
user_id
:每个用户有独立的请求计数,防止某个用户滥用API。request.client.host
:IP地址的请求计数,防止同一个IP地址滥用API。- 根据用户和IP的访问频率分别设置限制,提高了控制精度。
相关文章:
高效与高并发API开发:使用FastAPI与Redis实现请求限制与速率控制
高效与高并发API开发:使用FastAPI与Redis实现请求限制与速率控制 📚 目录 API速率限制的基本概念Redis实现分布式速率限制防止DDoS攻击的常见策略基于IP或用户身份的访问频率控制 1. API速率限制的基本概念 API速率限制(Rate Limiting&…...

Centos7源码编译安装Sqlite最新版本
下载源码 https://www.sqlite.org/download.html 复制下载链接,然后用 wget 下载 wget https://www.sqlite.org/2025/sqlite-autoconf-3490100.tar.gz 解压缩编译安装 tar -zxf sqlite-autoconf-3490100.tar.gz cd sqlite-autoconf-3490100 ./configure --prefi…...
mybatis热点面试题第五弹
1. MyBatis与Hibernate的区别 答案: MyBatis: 不完全是一个ORM框架,需要手动编写SQL语句,灵活性高,适合对数据库操作有高性能要求的场景。缺点是无法做到数据库无关性,如果需要支持多种数据库,…...

KTransformers部署 使671B DeepSeek R1成「办公桌标配」
671B DeepSeek R1成「办公桌标配」 1. 什么是KTransformersDeepSeek 版本技术破局密钥:强稀疏化MoE模型需要全新的私有化架构设计趋境AI大模型推理软硬一体工作站——让大模型推理门槛降低10倍 2. 准备环境3 环境准备与资源下载4 安装过程1. linux环境搭建2. window…...

sql-labs less5-8
Less-5 双注入 基于单引号的字符型注入,涉及二次查询注入 Less-6 双注入 基于双引号的字符型注入,涉及二次查询注入 Less-7 字符型注入 基于单引号变形注入之导入文件 Less-8 布尔盲注 不返回任何错误信息,通过布尔逻辑判断 以下…...
一个大型应用的云原生一般有多少个服务?
DeepSeek R1 思考 1 秒 思考过程 在云原生架构中,大型应用的服务规模呈现动态分布特征。根据行业实践和架构模式分析,服务划分的核心考量维度包括: 一、业务领域驱动划分 核心业务服务群(通常15-30个) 用户中心&…...

Linux下安装VS Code
Centos 7 https://blog.csdn.net/weixin_63790642/article/details/132927888 安装存储库 sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc密钥 sudo sh -c echo -e "[code]\nnameVisual Studio Code\nbaseurlhttps://packages.microsoft.com/yum…...
【零基础到精通Java合集】第一集:Java开发环境搭建
以下是针对**“Java开发环境搭建”**的15分钟课程内容设计,包含知识点拆分、实操演示与互动练习: 课程标题:Java开发环境搭建(15分钟) 目标:完成JDK安装、IDE配置并运行第一个Java程序 一、课程内容与时间分配 0-2分钟 课程目标与前置准备 明确学习目标:JDK安装、环境…...
Rocky Linux 系统安装 typecho 个人博客系统(Docker 方式)
typecho 博客系统安装 官网: https://typecho.org/ 1. 安装 Docker curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo && yum install docker-ce -y && docker -v && systemctl enable --now docker…...
C++-第二十一章:特殊类设计
目录 第一节:特殊类 1-1.不能被拷贝的类 1-2.只能在堆上构造的类 1-3.只能在栈上构造的类 1-4.只能构造一个对象的类 第二节:工厂模式 下期预告: 第一节:特殊类 1-1.不能被拷贝的类 不能被拷贝的类有线程类、std::unique_ptr、…...
pytorch 模型测试
在使用 PyTorch 进行模型测试时,一般包含加载测试数据、加载训练好的模型、进行推理以及评估模型性能等步骤。以下为你详细介绍每个步骤及对应的代码示例。 1. 导入必要的库 import torch import torch.nn as nn import torchvision import torchvision.transforms as trans…...
在kali linux中kafka的配置和使用
官方文档 一、安装依赖 删除原有的jdk sudo apt remove --purge openjdk-\* sudo apt clean安装 Java (JDK 11) sudo apt install openjdk-11-jdk -y # 验证安装 java -version二、下载并解压 Kafka 下载 Kafka wget https://dlcdn.apache.org/kafka/3.9.0/kafka_2.13-3.9.0.t…...
代码规范和简化标准
代码规范和简化标准是编写高质量、可维护、可扩展和可读代码的基本原则。遵循这些标准不仅能提高团队协作效率,还能减少出错的概率和后期维护的成本。以下是一些常见的代码规范和简化标准: 1. 命名规范 变量命名: 使用具有描述性的名称&…...

基于SpringBoot的校园二手交易平台(源码+论文+部署教程)
运行环境 校园二手交易平台运行环境如下: • 前端:Vue • 后端:Java • IDE工具:IntelliJ IDEA(可自行更换) • 技术栈:SpringBoot Vue MySQL 主要功能 校园二手交易平台主要包含前台和…...
【51单片机】快速入门
动手实践 > 理论空谈!从点亮LED开始,逐步扩展功能,2周可入门基础。 一、51单片机基础概念 什么是51单片机? 基于Intel 8051架构的8位微控制器,广泛用于嵌入式开发。 核心特性:4KB ROM、128B RAM、32个…...
YOLOv8+QT搭建目标检测项目
2024年7月YOLOv8QT初步搭建目标检测(避坑)_qt yolov8-CSDN博客YOLOv8QT初步搭建目标检测 2024年7月YOLOv8QT初步搭建目标检测(避坑)_qt yolov8-CSDN博客 yolov8的可视化界面(一、可视化界面设计)_yolo 可…...

刷题记录10
力扣72. 编辑距离 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符 解题思路: 本题与583. 两个字符串的删除操作其实是一样…...

数学软件Matlab下载|支持Win+Mac网盘资源分享
如大家所了解的,Matlab与Maple、Mathematica并称为三大数学软件。Matlab应用广泛,常被用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 Matlab将数值分析、矩阵计算、科学…...

5G学习笔记之BWP
我们只会经历一种人生,我们选择的人生。 参考:《5G NR标准》、《5G无线系统指南:如微见著,赋能数字化时代》 目录 1. 概述2. BWP频域位置3. 初始与专用BWP4. 默认BWP5. 切换BWP 1. 概述 在LTE的设计中,默认所有终端均能处理最大2…...
Spark 介绍
Spark 架构 Spark 是一个基于内存计算的大数据处理框架,相比 Hadoop 的 MapReduce,它能够提供 更高效的迭代计算 和 流式计算能力。Spark 采用 主从架构(Master-Slave),主要包括 Driver、Cluster Manager、Worker、Ex…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...