学习

如何使用 Redis 构建速率限制器

Ajeet Raina
作者
Ajeet Raina, Redis 前开发者增长经理

速率限制是许多开发人员在其职业生涯的某个阶段可能需要处理的一种机制。它可用于多种目的,例如共享对有限资源的访问或限制对 API 端点的请求次数,并以 429 状态码响应。

在本教程中,我们将了解如何使用各种编程语言实现速率限制。

步骤 1. 先决条件#

  • Python
  • Docker
  • Docker Compose

步骤 2. 克隆存储库#

git clone https://github.com/redis-developer/basic-rate-limiting-demo-python

步骤 3. 运行 docker compose 或手动安装 redis#

docker network create global
docker-compose up -d --build

如果您手动安装 redis,请打开 django-backend/configuration 文件夹并将 .env.example 复制以创建 .env。并为环境变量提供值 - REDIS_HOST: Redis 服务器主机 - REDIS_PORT: Redis 服务器端口 - REDIS_DB: Redis 服务器数据库索引 - REDIS_PASSWORD: Redis 服务器密码

步骤 4. 设置和运行#

安装 python、pip 和 venv(在 mac 上: https://installpython3.com/mac/)

使用 python 版本:3.8

python3 -m venv venv
source ./venv/bin/activate
pip3 install -r requirements.txt
python3 manage.py collectstatic
python3 manage.py runserver

步骤 5. 访问速率限制应用程序

它是如何工作的?#

数据是如何存储的?#

此应用程序将在客户端超出一定数量的请求(默认:10)后阻止来自客户端的连接(默认:10 秒)。应用程序将在每次请求后返回以下标头。这将让用户知道在超过限制之前他们还有多少请求。在第 10 次运行时,服务器应返回 HTTP 状态代码 429 太多请求

SETNX 是 "SET if Not eXists" 的缩写。它基本上将 key 设置为保存字符串值,如果 key 不存在。在这种情况下,它等于 SET。当 key 已经保存值时,不会执行任何操作。新的响应将添加 key-ip,如下所示

 SETNX your_ip:PING limit_amount
 Example: SETNX 127.0.0.1:PING 10

更多信息

在 key 上设置超时

 EXPIRE your_ip:PING timeout
 Example: EXPIRE 127.0.0.1:PING 1000

数据是如何访问的?#

下一个响应是获取桶

 GET your_ip:PING
 Example: GET 127.0.0.1:PING

更多信息

下一个响应是更改桶

 DECRBY your_ip:PING amount
 Example: DECRBY 127.0.0.1:PING 1

参考#