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則不通過
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章