用例:
我正在为Web应用程序实现速率限制器。对于每个传入的HTTP请求,我都会增加一个Redis计数器,其中IP地址是关键。另外,我设置了30分钟TTL的到期时间,以避免内存泄漏。
问题:
现在我有成千上万的条目,我想获得那些计数器值最高的条目。我该怎么办?
答案 0 :(得分:2)
一种选择可能是使用redis Sorted Set并将得分作为请求计数,因此要增加计数,可以使用ZINCRBY并获得最高的 N ,您可以使用ZRANGE。
新请求:
> ZINCRBY requests 1 10.0.0.1
获得前N名:
> ZRANGE requests -5 -1 WITHSCORES
缺点是您将无法为每个IP设置超时,但是您可以通过在每个超时期间使用不同的密钥将请求分为不同的排序集中来克服这一问题。
例如,如果您要计算每天的请求,而不是使用相同的键字符串“ requests” ,则可以将键构造为类似于“ requests- 日期” :
> ZINCRBY requests-19/01/25 1 10.0.0.1
> EXPIREAT requests-19/01/25 1516924800