需求:
同一个key在timeoutSeconds时间段内最多能够调用k次接口,超过则拒绝返回false。
实现方法:
把当前key每一次调用时间记录下来,判断最近时间段内是否达到了允许的最大次数,达到则拒绝。
存在问题:
acquire方法执行时间(可能十几毫秒)内,存在并发的情况下则会把同一时间的所有acquire调用只当成一次。
解决此问题的最佳方法是对该acquire同个key做线程同步,同步方式应该是轻量锁乐观锁自旋锁,因为此方法并不会阻塞线程多久。
public class RateUtil {
private static ValueOperations<String, String> valueOperations;
private static final String delimiter = ",";
private static boolean acquire(String key, int k