学习

如何使用 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 (Too Many Requests)。

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

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

更多信息

为键设置超时

 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

参考资料#