跳转到主要内容

简单Redis速率限制

项目描述

rrl - Redis速率限制

非常简单且可重用的基于Redis的速率限制代码。为OpenStates.org设计。

Test

配置

rrl,顾名思义,需要一个Redis服务器。

rrl完全由环境变量进行配置

RRL_REDIS_HOST - Redis实例的主机名(默认:localhostRRL_REDIS_PORT - Redis实例的端口号(默认:6379RRL_REDIS_DB - 用于RRL的数据库ID(默认:0

用法

可以使用每分钟、每小时和/或每天的基础来限制使用。

rrl有一个名为Tier的概念,它将名称与一组限制相关联,例如

# create two tiers
bronze = Tier(name="bronze", per_minute=1, per_hour=0, per_day=500)
silver = Tier(name="silver", per_minute=5, per_hour=0, per_day=4000)

这些层不使用per_hour功能,但将用户限制为每分钟1个或5个请求。同时,每天也有500或4000个请求的每日限制。

然后您需要一个rrl.RateLimiter实例,该实例将与这些层一起实例化

limiter = RateLimiter(tiers=[bronze, silver])

然后要应用限制,您将调用check_limit函数,它接受三个参数

  • key - 一个针对每个用户的唯一键,通常是用户的API密钥或用户名。(注意:rrl不知道密钥是否有效,该验证应在您的应用程序中完成,并且通常在调用check_limit之前完成。)
  • tier_name - 当实例化RateLimiter类时指定的层的名称。(注意:rrl没有关于哪些用户属于哪个层的概念,该逻辑应由您的密钥验证代码处理。)

示例调用

limiter.check_limit(key="1234", tier_name="bronze")

如果调用被视为允许,则此调用将返回而不会出现任何错误。

如果任何速率限制被超过,则将抛出一个描述哪个限制被超过的RateLimitExceeded异常。
如果多个限制被超过,则将返回最短的限制违反。

高级用法

获取使用信息

您的RateLimiter实例还有一个名为get_usage_since的方法,该方法接受四个参数

  • key - 您要请求使用信息的关键字。
  • start - 您想要使用信息的起始日期,作为datetime.date对象。
  • end - 可选的结束日期,如果您只想在某个时间段内使用,否则将使用当前日期。

这将返回一个包含以下属性的DailyUsage数据类的列表

  • date - datetime.date
  • calls - 该日期的调用次数。

此方法可以用于向用户展示其数据的概述。

高级配置

在实例化RateLimiter时,您可以设置一些关键字参数

prefix

传递一个前缀,例如

limiter = RateLimiter(tiers, prefix="v1")

将所有调用限制器的调用范围限定在给定的前缀内,这可以在您想使用多个限制器但想确保它们之间不相互干扰时很有用。

use_redis_time

默认为True,但如果您将其设置为False,则应用程序的系统时间将代替Redis的时间。

这里的权衡是每次调用check_limit时对Redis的调用次数减少一次,但如果您的机器出现任何时钟漂移,可能会出现意外的结果。

track_daily_usage

默认为True,但如果设置为False,则rrl将不会存储使get_usage_since工作所需的信息。这会导致轻微的负载减少,但使用信息将不会存储在Redis中,并且无法检索。

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面