我只想使用redi对rest api进行速率限制。能否请您建议我,redis中的哪个数据结构是合适的。在更新密钥和值之后,我只使用了RedisTemplate,这对于一个元素到期是不可行的。
答案 0 :(得分:1)
有多种方法,取决于你想要达到的目标 - 来自一般" ops per second"限制,以较低分辨率限制细粒度限制,例如特定用户每天可以发布的帖子数量等。
我喜欢的一个非常简单而优雅的方法是即将到期的计数器。该技术很简单,并利用INCR不会在redis中更改密钥的到期时间这一事实。所以基本上如果你想在一个资源上每秒1000个请求,只需创建一个数字为1的密钥(通过运行INCR)并在一秒钟内使其到期。然后对每个请求检查它是否达到1000并且如果没有增加它。如果有 - 阻止请求。时间窗口过后,密钥将自动过期,并在下一个请求时重新创建。
就伪代码而言,算法是:
def limit(resource_key):
current = GET(resource_key)
if current != NULL and current >= 1000:
return ERROR
else:
value = INCR(resource_key)
IF value == 1:
EXPIRE(value,1)
return OK