利用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则不通过