dependency
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.0</version>
</dependency>
class Constant
public class Constant {
public static final int REDIS_PORT = 6379;
public static final String REDIS_IP = "localhost";
public static final String REDIS_TEST_ZSET_KEY = "testZsetKey";
}
class CurrentLimiter
import com.tbryant.test.domain.Constant;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response;
import java.io.IOException;
public class CurrentLimiter {
private static final Jedis JEDIS = new Jedis(Constant.REDIS_IP, Constant.REDIS_PORT);
static boolean doCurrentLimiterValid(String apiName, String value, int maxCount) {
long currentTimeMillis = System.currentTimeMillis();
long score = currentTimeMillis / 1000;
Pipeline pipe = JEDIS.pipelined();
pipe.multi();
pipe.zremrangeByScore(apiName, 0, score - 1);
pipe.zadd(apiName, score, value);
Response<Long> count = pipe.zcard(apiName);
pipe.expire(apiName, 3);
pipe.exec();
try {
pipe.close();
} catch (IOException e) {
e.printStackTrace();
}
return count.get() <= maxCount;
}
}
class CurrentLimiterTest
import com.tbryant.test.domain.Constant;
public class CurrentLimiterTest {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (CurrentLimiter.doCurrentLimiterValid(Constant.REDIS_TEST_ZSET_KEY, i + "", 10)){
System.out.println("=====请求成功=====");
}else{
System.out.println("限流处理");
}
}
}
}