指定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";