redis实现接口限流的多种方式

这里写自定义目录标题

1.固定窗口

public String testFixedWindow() {
String now = formatter.format(LocalDateTime.now());

    Long count = redisTemplate.opsForValue().increment(now + ":fixed");
    if (count > 5) {
        return "不好意思,服务器正忙,请一分钟后再试......";
    } else {
        return "服务端正在处理";
    }

该方式优点是比较简单粗暴,缺点是不够灵活,对于边界问题不能够处理,如设置的时间段刚开始时流量占满了设置的最大次数,后面一段时间则不能够再进行访问,必须等该时间段过了后才可以再次访问。

2.滑动窗口

在这里插入图片描述

通过上述代码可以做到滑动窗口的效果,并且能保证每N秒内至多M个请求,
缺点就是
1.zset的数据结构会越来越大。实现方式相对也是比较简单的。
2.每个请求都需要重新统计最新时间窗口内的请求数,性能较低。

3.令牌桶

RRateLimiter rateLimiter = redisson.getRateLimiter(“myRateLimiter”);

    // 最大流速 = 每10秒钟产生1个令牌
    rateLimiter.trySetRate(RateType.OVERALL, 1, 10, RateIntervalUnit.SECONDS);
    //需要1个令牌
    if (rateLimiter.tryAcquire(1)) {
        return "令牌桶里面有可使用的令牌";
    }
    return "不好意思,请过十秒钟再来~~~~~~~";
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值