gpt4 book ai didi

redis - 如何使用Redis实现限速

转载 作者:IT王子 更新时间:2023-10-29 05:54:42 25 4
gpt4 key购买 nike

我使用 INCREXPIRE 来实现速率限制,例如,每分钟 5 个请求:

if EXISTS counter
count = INCR counter
else
EXPIRE counter 60
count = INCR counter

if count > 5
print "Exceeded the limit"

但是,第一分钟的最后一秒可以发送 5 个请求,第二分钟的第一秒可以发送另外 5 个请求,即两秒内有 10 个请求。

如何避免这个问题?


更新:我想出了这个列表实现。这是一个好的方法吗?

times = LLEN counter
if times < 5
LPUSH counter now()
else
time = LINDEX counter -1
if now() - time < 60
print "Exceeded the limit"
else
LPUSH counter now()
LTRIM counter 5

最佳答案

您可以从“最后一分钟 5 个请求”切换到“第 x 分钟 5 个请求”。这样就可以做到:

counter = current_time # for example 15:03
count = INCR counter
EXPIRE counter 60 # just to make sure redis doesn't store it forever

if count > 5
print "Exceeded the limit"

如果你想继续使用“最后一分钟的 5 个请求”,那么你可以这样做

counter = Time.now.to_i # this is Ruby and it returns the number of milliseconds since 1/1/1970
key = "counter:" + counter
INCR key
EXPIRE key 60

number_of_requests = KEYS "counter"*"
if number_of_requests > 5
print "Exceeded the limit"

如果您有生产限制(尤其是性能),则为 not advised使用 KEYS 关键字。我们可以使用 sets 代替:

counter = Time.now.to_i # this is Ruby and it returns the number of milliseconds since 1/1/1970
set = "my_set"
SADD set counter 1

members = SMEMBERS set

# remove all set members which are older than 1 minute
members {|member| SREM member if member[key] < (Time.now.to_i - 60000) }

if (SMEMBERS set).size > 5
print "Exceeded the limit"

这都是伪 Ruby 代码,但应该能让您明白。

关于redis - 如何使用Redis实现限速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13175050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com