redis+lua实现分布式限流

利用redis + lua 原子性的特性,实现分布式限流,代码如下

 /**
     *  KEYS[1] 锁定的key
     *  ARGV[1]  失效时间
     *  ARGV[2]  判断的数字
     *  redis 自增, 失效时间过期后,自增也就失效
     *  ,利用这个特性可以做分布式限流
     */
   String redisLua = "local num = redis.call('incr', KEYS[1])\n" +
            "if tonumber(num) == 1 then\n" +
            "\tredis.call('expire', KEYS[1], ARGV[1])\n" +
            "\treturn 1\n" +
            "elseif tonumber(num) > tonumber(ARGV[2]) then\n" +
            "\treturn 0\n" +
            "else \n" +
            "\treturn 1\n" +
            "end\n";
  /**
     *  失效时间
     *  判断的数字
     */
  List<String> argList = Arrays.asList("5", "1");
    //要获取的key值
  List<String> keys = new ArrayList<>();
  keys.add("testKey");
  Jedis jedis = new Jedis();
  String scriptLoad = jedis.scriptLoad(script);
  Long dataResult = (Long)jedis.evalsha(scriptLoad,keysList,argList);
  // 结果为 1 则通过,为0则不通过
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章