数据库
首页 > 数据库> > redis 限流策略

redis 限流策略

作者:互联网

固定时间窗口算法

 优点

    在固定的时间内出现流量溢出可以立即做出限流。每个时间窗口不会相互影响
    在时间单元内保障系统的稳定。保障的时间单元内系统的吞吐量上限

缺点

    正如图示一样,他的最大问题就是临界状态。在临界状态最坏情况会受到两倍流量请求
    除了临界的情况,还有一种是在一个单元时间窗内前期如果很快的消耗完请求阈值。那么剩下的时间将会无法请求。这样就会因为一瞬间的流量导致一段时间内系统不可用。这在互联网高可用的系统中是不能接受的。

滑动时间窗口算法

 优点

    实质上就是固定时间窗口算法的改进。所以固定时间窗口的缺点就是他的优点。
    内部抽象一个滑动的时间窗,将时间更加小化。存在边界的问题更加小。客户感知更弱了。

缺点

    不管是固定时间窗口算法还是滑动时间窗口算法,他们都是基于计数器算法进行优化,但是他们对待限流的策略太粗暴了。
    为什么说粗暴呢,未限流他们正常放行。一旦达到限流后就会直接拒绝。这样我们会损失一部分请求。这对于一个产品来说不太友好

漏桶算法

 优点

    面对限流更加的柔性,不在粗暴的拒绝
    增加了接口的接收性,保证下流服务接收的稳定性。均匀下发

缺点

    漏桶容量是个短板

 

令牌桶算法

 // 输出令牌
public Response limitFlow2(Long id){
        Object result = redisTemplate.opsForList().leftPop("limit_list");
        if(result == null){
            return Response.ok("当前令牌桶中无令牌");
        }
        return Response.ok(articleDescription2);
    } 

  再依靠Java的定时任务,定时往List中rightPush令牌,当然令牌也需要唯一性,这里还是用UUID进行了生成

// 10S的速率往令牌桶中添加UUID,只为保证唯一性
    @Scheduled(fixedDelay = 10_000,initialDelay = 0)
    public void setIntervalTimeTask(){
        redisTemplate.opsForList().rightPush("limit_list",UUID.randomUUID().toString());
    } 

 

 

标签:令牌,窗口,策略,redis,算法,限流,时间,请求
来源: https://www.cnblogs.com/hzzjj/p/16517818.html