Redis 并发访问简单IP控制

我需要定义一个地方来记录/验证每个Ip的访问次数。如果任何Ip的数量大于每分钟十次的Ip请求将被拒绝。

此脚本被创建用于验证此条件。如果Ip不存在,则Lua脚本将创建此Ip的新计数器,并设置60秒的TTL。如果存在,它将增加它,并验证此Ip的计数器是否大于十。

KEYS[1]==163.2.2.2

 if redis.call("EXISTS",KEYS[1]) == 1 then
  local ocurrences=redis.call("INCR",KEYS[1])
  if ocurrences>10 then
    return true
  else
    return false
 end
else
  redis.call("SETEX",KEYS[1],60,1)
  return false
end

它运行良好,但是Lua脚本或Lua上的事务会阻止Redis进行乐观锁定的验证。使用Redis而不阻塞Redis并且没有读写访问竞争问题的最佳方法是什么?

点赞
用户3160475
用户3160475

在 Redis 中,(几乎)所有的命令都会阻塞服务器,包括 Lua 脚本的执行。那么,记住虽然你的服务器仍然可以为许多请求提供服务,但它们是隔离的。

Lua 脚本不需要乐观,只要它们足够简单 - 就像你的脚本一样 - 就是一个不错的选择。在我看来,这个脚本对于基本的速率限制来说是可以做到预期的。

2018-01-16 19:21:34