从redis中的一组计数器获取最高计数器值
用例: 我正在为一个web应用程序实现一个速率限制器。对于每个传入的HTTP请求,我增加一个redis计数器,其中IP地址是密钥。此外,我设置了一个30分钟的TTL过期,以避免内存泄漏 问题:从redis中的一组计数器获取最高计数器值,redis,Redis,用例: 我正在为一个web应用程序实现一个速率限制器。对于每个传入的HTTP请求,我增加一个redis计数器,其中IP地址是密钥。此外,我设置了一个30分钟的TTL过期,以避免内存泄漏 问题: 现在我有数千个条目,我想得到那些具有最高计数器值的条目。如何做到这一点?一种选择是使用redis,并将分数作为请求计数,这样可以增加您可以使用的计数,并获得您可以使用的前N 新要求: > ZINCRBY requests 1 10.0.0.1 获得前N名: > ZRANGE requests
现在我有数千个条目,我想得到那些具有最高计数器值的条目。如何做到这一点?一种选择是使用redis,并将分数作为请求计数,这样可以增加您可以使用的计数,并获得您可以使用的前N 新要求:
> ZINCRBY requests 1 10.0.0.1
获得前N名:
> ZRANGE requests -5 -1 WITHSCORES
缺点是您无法为每个IP设置超时,但您可以通过为每个超时时间使用不同的键将请求分为不同的排序集来克服这一问题
例如,如果要计算每天的请求数,而不是使用相同的键字符串“requests”,则可以将键构造为类似于“requests date”:
> ZINCRBY requests-19/01/25 1 10.0.0.1
> EXPIREAT requests-19/01/25 1516924800
这正是我想到的一个解决方案,我希望它可以滚动而不是requestdate,但似乎没有一个简单的解决方案可以用Redis来克服这一点。