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

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

golang循环变量捕获问题​​

在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下: 问题背景 看这个代码片段: fo…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

如何为服务器生成TLS证书

TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...