java redis令牌桶_接口限流&令牌桶算法&Redis分布式限流

工作中对外提供的API 接口设计很多时候要考虑限流,如果不考虑,可能会造成系统的连锁反应,轻者响应缓慢,重者系统宕机。而常用的限流算法有令牌桶算法和漏桶算法,本篇介绍令牌桶算法

令牌桶算法

image.png

原理如上图,系统以恒定速率不断产生令牌,令牌桶有最大容量,超过最大容量则丢弃,同时用户请求接口,如果此时令牌桶中有令牌则能访问获取数据,否则直接拒绝用户请求

java代码实现

/**

* 线程池每0.5s发送随机数量的请求,每次请求计算当前的令牌数量,请求令牌数量超出当前令牌数量,则产生限流

*/

@Slf4j

public class TokensLimiter {

private ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);

// 最后一次令牌发放时间

public long timeStamp = System.currentTimeMillis();

// 桶的容量

private int capacity = 7;

// 令牌生成速度5/s

private int rate = 5;

// 当前令牌数量

private int tokens;

public void acquire

你可能感兴趣的:(java,redis令牌桶)