Redis速率限制器模式

Redis速率限制器模式,redis,load-balancing,distributed-computing,rate-limiting,Redis,Load Balancing,Distributed Computing,Rate Limiting,我正在尝试使用“模式:限速器1”下指定的Redis限速模式。但是,如果我想跨多个服务器进行速率限制,我如何扩展它呢。就像我在负载平衡器后面的5台服务器上部署了服务一样,我希望5台服务器上每个api密钥的总请求不应超过x/秒。根据我提到的redis模式,问题是如果我的限速器本身在多个服务器上运行,那么对两个不同限速器服务器的两个不同请求可以同时执行“获取密钥”并读取相同的值,然后再进行更新,这可能会允许更多的请求进入。我如何处理?我显然可以将get放入MULTI-block,但我认为这会使事情变得

我正在尝试使用“模式:限速器1”下指定的Redis限速模式。但是,如果我想跨多个服务器进行速率限制,我如何扩展它呢。就像我在负载平衡器后面的5台服务器上部署了服务一样,我希望5台服务器上每个api密钥的总请求不应超过x/秒。根据我提到的redis模式,问题是如果我的限速器本身在多个服务器上运行,那么对两个不同限速器服务器的两个不同请求可以同时执行“获取密钥”并读取相同的值,然后再进行更新,这可能会允许更多的请求进入。我如何处理?我显然可以将get放入MULTI-block,但我认为这会使事情变得更慢。

您需要运行LUA脚本,该脚本将检查速率限制并增加/减少/重置计数器

您可以在这里的幼虫框架中找到一个简单的示例

/**
*获取获取锁的Lua脚本。
*
*键[1]-限制器名称
*ARGV[1]-以微秒为单位的当前时间
*ARGV[2]-以秒为单位的当前时间
*ARGV[3]-存储桶的持续时间
*ARGV[4]-允许的任务数
*
*@返回字符串
*/
受保护函数luaScript()
{

return您需要运行LUA脚本,该脚本将检查速率限制并增加/减少/重置计数器

您可以在这里的幼虫框架中找到一个简单的示例

/**
*获取获取锁的Lua脚本。
*
*键[1]-限制器名称
*ARGV[1]-以微秒为单位的当前时间
*ARGV[2]-以秒为单位的当前时间
*ARGV[3]-存储桶的持续时间
*ARGV[4]-允许的任务数
*
*@返回字符串
*/
受保护函数luaScript()
{

returnINCR使用更新的值进行回复。因此它可以用作写入和读取命令

FUNCTION LIMIT_API_CALL(ip)
ts = CURRENT_UNIX_TIME()
keyname = ip+":"+ts

MULTI
    INCR(keyname)
    EXPIRE(keyname,10)
EXEC

current = RESPONSE_OF_INCR_WITHIN_MULTI
IF current > 10 THEN
    ERROR "too many requests per second"
ELSE
    PERFORM_API_CALL()
END

INCR使用更新的值进行响应。因此它可以用作写入和读取命令

FUNCTION LIMIT_API_CALL(ip)
ts = CURRENT_UNIX_TIME()
keyname = ip+":"+ts

MULTI
    INCR(keyname)
    EXPIRE(keyname,10)
EXEC

current = RESPONSE_OF_INCR_WITHIN_MULTI
IF current > 10 THEN
    ERROR "too many requests per second"
ELSE
    PERFORM_API_CALL()
END

是的。我喜欢。你在更新后做了计数检查。是的。我喜欢。你在更新后做了计数检查。这也是一种方法。这也是一种方法