import redis.clients.jedis.Jedis;
public class RateLimiter {
private final Jedis jedis;
private final String keyPrefix;
private final int limit;
private final int seconds;
public RateLimiter(Jedis jedis, String keyPrefix, int limit, int seconds) {
this.jedis = jedis;
this.keyPrefix = keyPrefix;
this.limit = limit;
this.seconds = seconds;
}
public boolean isAllowed(String userId) {
String key = keyPrefix + ":" + userId;
long now = System.currentTimeMillis() / 1000;
long count = jedis.incr(key);
if (count == 1) {
jedis.expire(key, seconds); // 如果是第一次访问,设置键的过期时间
}
// 如果当前次数超过限制,则不允许访问,并删除该键以便下次重新计数
if (count > limit) {
jedis.del(key);
return false;
}
// 如果没有超过限制,则允许访问
return true;
}
}
这段代码定义了一个名为RateLimiter
的类,它使用Redis的INCR命令来跟踪给定用户ID的请求次数,并在达到限制时删除键。它展示了如何使用Redis来实现简单的限流工具,并且是学习Redis限流机制的一个很好的起点。