基于 Redisson 提供的 API,可以使用 RSemaphore 来实现对接口访问次数的限制。
import org.redisson.api.RSemaphore;
import org.redisson.api.RedissonClient;
public class LimitAccess {
private RedissonClient redissonClient;
private int limit;
private int hours;
public LimitAccess(RedissonClient redissonClient, int limit, int hours) {
this.redissonClient = redissonClient;
this.limit = limit;
this.hours = hours;
}
public boolean tryAccess(String ip, String api) {
String key = ip + ":" + api;
RSemaphore semaphore = redissonClient.getSemaphore(key);
semaphore.trySetPeriodicExpiration(hours, TimeUnit.HOURS);
return semaphore.tryAcquire();
}
}
在调用 tryAccess 方法时,传入 IP 和接口名称作为参数,如果获取到信号量,则表示访问成功,否则表示访问失败。每个 IP + 接口 的信号量的数量最多为 N,信号量的过期时间为 N 小时。
请注意,这仅是一种参考实现,在实际使用中可能需要根据具体需求进行修改和优化。