Conan
Conan
发布于 2024-05-10 / 60 阅读
0
0

Redis使用LUA脚本原子操作指定时间内不能超过指定次数

指定Key,判断在指定时间内的,次数【比如可以做,1分钟,只能请求10次这种需求】

  public boolean rateLimit(String redisKey, int limit, int expireTime) {
    DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>(LUA_LIMIT, Boolean.class);
    Boolean result =
        (Boolean)
            redisTemplate.execute(
                redisScript, Collections.singletonList(redisKey), limit, expireTime);
    return BooleanUtil.isTrue(result);
  }

  private static final String LUA_LIMIT =
      "local key = KEYS[1]\n"
          + "local limit = tonumber(ARGV[1])\n"
          + "local expireTime = tonumber(ARGV[2])\n"
          + "local current\n"
          + "\n"
          + "current = redis.call('incr', key) \n"
          + "if current == 1 then\n"
          + "  redis.call('expire', key, expireTime)\n"
          + "elseif current > limit then    \n"
          + "  return true\n"
          + "end\n"
          + "return false";


评论