当前位置: 首页 > news >正文

高效与高并发API开发:使用FastAPI与Redis实现请求限制与速率控制

高效与高并发API开发:使用FastAPI与Redis实现请求限制与速率控制

📚 目录

  1. API速率限制的基本概念
  2. Redis实现分布式速率限制
  3. 防止DDoS攻击的常见策略
  4. 基于IP或用户身份的访问频率控制

1. API速率限制的基本概念

API速率限制(Rate Limiting)是控制用户访问API的请求速率的一种机制,防止系统被过多请求淹没。通过对用户的请求进行计数与限制,API能够在高并发情况下维持性能与稳定性。

速率限制的主要目的是:

  • 防止过多请求导致服务器负载过高。
  • 限制恶意或非正常行为,如暴力破解、爬虫攻击等。
  • 提高API的可用性,确保公平分配资源。

常见的速率限制算法

  1. 漏桶算法(Leaky Bucket Algorithm)
    漏桶算法在一定时间窗口内以固定速率处理请求,若请求速率超过预定限度,则会被丢弃或延迟。

  2. 令牌桶算法(Token Bucket Algorithm)
    令牌桶算法是一种灵活的速率控制机制,适合处理突发流量。每个请求都需要获取一个令牌,如果令牌桶为空,则请求被丢弃。

  3. 固定窗口计数法(Fixed Window Counter)
    在固定时间窗口内,计数器记录请求的次数,一旦请求超出限制,后续请求将被拒绝。

  4. 滑动窗口计数法(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层面实现防护。

常见的防御策略

  1. IP黑名单/白名单
    基于IP的访问控制可以有效阻止已知攻击源的流量。通过将恶意IP加入黑名单,可以防止这些IP的请求进入系统。

  2. 请求速率限制
    利用速率限制算法(如漏桶或令牌桶),控制请求频率,避免单个来源发送过多请求。

  3. 行为分析与智能防护
    通过分析请求的行为模式,识别并阻止异常流量。例如,检测异常的请求头、请求频率、请求路径等。

  4. 验证码与身份验证
    在用户请求的关键环节,如登录、注册、支付等,加入验证码或二次身份验证,防止恶意机器人自动化攻击。

示例代码:基于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语句,灵活性高,适合对数据库操作有高性能要求的场景。缺点是无法做到数据库无关性,如果需要支持多种数据库&#xff0c…...

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…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

PHP和Node.js哪个更爽?

先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...

智警杯备赛--excel模块

数据透视与图表制作 创建步骤 创建 1.在Excel的插入或者数据标签页下找到数据透视表的按钮 2.将数据放进“请选择单元格区域“中,点击确定 这是最终结果,但是由于环境启不了,这里用的是自己的excel,真实的环境中的excel根据实训…...

使用 uv 工具快速部署并管理 vLLM 推理环境

uv:现代 Python 项目管理的高效助手 uv:Rust 驱动的 Python 包管理新时代 在部署大语言模型(LLM)推理服务时,vLLM 是一个备受关注的方案,具备高吞吐、低延迟和对 OpenAI API 的良好兼容性。为了提高部署效…...