当前位置: 首页 > 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…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

day52 ResNet18 CBAM

在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异&#xff…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...