利用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則不通過