算法~利用zset实现滑动窗口限流

zset · 浏览次数 : 0

小编点评

**滑动窗口限流算法** 滑动窗口限流是一种常用的限流算法,通过维护一个固定大小的窗口,在单位时间内允许通过的请求次数不超过设定的阈值。 **算法步骤:** 1. **初始化:** - 设置窗口大小、请求次数阈值和时间间隔。 - 初始化窗口,将请求按照时间顺序放入窗口中,并保持窗口内请求数量不超过阈值。 2. **检查通过:** - 每当有新的请求到达时,检查窗口内请求的总数是否超过阈值。 3. **更新窗口:** - 当窗口内请求数量超过阈值时,移除窗口最老的请求。 - 更新窗口内的请求情况,确保窗口内的请求符合限流条件。 4. **重复** **代码实现:** ```java public void slidingWindow(String key, int timeWindow, int limit, Runnable runnable) { long currentTime = System.currentTimeMillis(); if (redisTemplate.hasKey(key)) { long intervalTime = timeWindow * 1000L; long from = currentTime - intervalTime; Integer count = redisTemplate.opsForZSet().rangeByScore(key, from, currentTime).size(); if (count != null && count >= limit) { throw new RedisLimitException("每" + timeWindow + "秒最多只能访问" + limit + "次."); } log.info("from key:{}~{},current count:{}", from, currentTime, count); } redisTemplate.opsForZSet().add(key, UUID.randomUUID().toString(), currentTime); Optional.ofNullable(runnable).ifPresent(o -> o.run()); } ``` **注意:** * 窗口大小、请求次数阈值和时间间隔需要根据具体需求进行设置。 * 滑动窗口限流算法不能完全解决突发请求,因此在实际应用中可能需要结合其他策略进行综合考虑。 * 在使用滑动窗口限流算法之前,请确保您的系统有足够的内存来处理窗口中的请求。

正文

滑动窗口限流

滑动窗口限流是一种常用的限流算法,通过维护一个固定大小的窗口,在单位时间内允许通过的请求次数不超过设定的阈值。具体来说,滑动窗口限流算法通常包括以下几个步骤:

  1. 初始化:设置窗口大小、请求次数阈值和时间间隔。
  2. 维护窗口:将请求按照时间顺序放入窗口中,并保持窗口内请求数量不超过阈值。
  3. 检查通过:每当有新的请求到达时,检查窗口内请求的总数是否超过阈值,如果未超过则允许通过,同时移除窗口最老的请求。
  4. 更新窗口:随着时间的推移,更新窗口内的请求情况,确保窗口内的请求符合限流条件。

滑动窗口限流算法可以有效控制系统的请求流量,避免系统被大量请求压垮。同时,由于其简单高效的特点,被广泛应用于接口限流、流量控制等场景中。需要注意的是,滑动窗口限流算法对于突发请求并不能完全解决问题,因此在实际应用中可能需要结合其他策略进行综合考虑。

基于redis-zset实现的滑动窗口算法流程

核心代码

/**
 * 滑动窗口限流. 需要注意的是,我们要定期清楚过期的key,否则会导致内存泄漏,可以使用ZREMRANGEBYSCORE方法实现.
 * @param key 限流的key
 * @param timeWindow 单位时间,秒
 * @param limit 窗口大小,单位时间最大容许的令牌数
 * @param runnable 成功后的回调方法
 */
public void slidingWindow(String key, int timeWindow, int limit, Runnable runnable) {
    Long currentTime = System.currentTimeMillis();
    if (redisTemplate.hasKey(key)) {
        Long intervalTime = timeWindow * 1000L;
        Long from = currentTime - intervalTime;
        Integer count = redisTemplate.opsForZSet().rangeByScore(key, from, currentTime).size();
        if (count != null && count >= limit) {
            throw new RedisLimitException("每" + timeWindow + "秒最多只能访问" + limit + "次.");
        }
        log.info("from key:{}~{},current count:{}", from, currentTime, count);
    }
    redisTemplate.opsForZSet().add(key, UUID.randomUUID().toString(), currentTime);
    Optional.ofNullable(runnable).ifPresent(o -> o.run());
}

上面实现了一个基于时间戳为主要窗口依据的滑动窗口限流逻辑,由于zset的数据量会随着时间的流失而变大,所以我们需要定期再根据score来清理它。

/**
 * 清期昨天的zset元素,这块应该写个任务调度,每天执行一次,清量需要的zset元素.
 * @param key
 */
public void delByYesterday(String key) {
    Instant currentInstant = Instant.now();
    Instant oneDayAgoInstant = currentInstant.minusSeconds(86400);
    long oneDayAgoTimeMillis = oneDayAgoInstant.toEpochMilli();
    redisTemplate.opsForZSet().removeRangeByScore(key, 0, oneDayAgoTimeMillis);

}

上面代码逻辑,事实上,我们可以通过其它语言去实现,比较通过go可以实现相关的逻辑,从新可以在MSE网关上实现限流功能。

与算法~利用zset实现滑动窗口限流相似的内容:

算法~利用zset实现滑动窗口限流

滑动窗口限流 滑动窗口限流是一种常用的限流算法,通过维护一个固定大小的窗口,在单位时间内允许通过的请求次数不超过设定的阈值。具体来说,滑动窗口限流算法通常包括以下几个步骤: 初始化:设置窗口大小、请求次数阈值和时间间隔。 维护窗口:将请求按照时间顺序放入窗口中,并保持窗口内请求数量不超过阈值。 检查

MATLAB实现随机森林(RF)回归与自变量影响程度分析

本文介绍基于MATLAB,利用随机森林(RF)算法实现回归预测,以及自变量重要性排序的操作~

CF1827

# CF1827 ## A. Counting Orders 简单计数。 两个都排序,双指针维护一下 `a[i]` 在 `b[p]` 的位置(`a[i] ## C. Palindrome Partition ~~回文好题~~。 考虑利用 `Manacher` 求出每一个偶数的回文串。 > 参考:[算

算法~PBKDF2-SHA让密码更安全

摘要:在当今的数字世界中,密码安全是至关重要的。为了保护用户密码免受未经授权的访问和破解,Password-Based Key Derivation Function 2 (PBKDF2)算法成为了一种重要的工具。 在 PBKDF2 算法中,SHA 表示 Secure Hash Algorithm,

单窗算法的地表温度反演:谷歌地球引擎GEE代码

本文介绍在GEE中基于Landsat遥感影像实现地表温度(LST)单窗算法反演的代码~

算法学习笔记(9): 中国剩余定理(CRT)以及其扩展(EXCRT)

# 扩展中国剩余定理 [TOC] 讲解扩展之前,我们先叙述一下普通的中国剩余定理 > “China Remain Theory” 也叫做**孙子定理** > > 难得是以中国命名的定理~~,谁敢不掌握~~ ## 中国剩余定理 > 中国剩余定理通过一种非常精巧的构造求出了一个可行解 > > 但是毕竟是

SMOGN算法Python实现:解决回归分析中的数据不平衡

本文介绍基于Python语言中的smogn包,读取.csv格式的Excel表格文件,实现SMOGN算法,对机器学习、深度学习回归中,训练数据集不平衡的情况加以解决的具体方法~

ENVI、ERDAS计算Landsat 7地表温度:单窗算法实现

本文介绍基于ENVI与ERDAS软件,对Landsat 7遥感影像数据加以单窗算法的地表温度(LST)反演操作~

LeetCode 周赛 332,在套路里摸爬滚打~

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,今天是 3T 选手小彭。 上周是 LeetCode 第 332 场周赛,你参加了吗?算法解题思维需要长时间锻炼,加入我们一起刷题吧~ 小彭的 Android 交流群 02 群已经建立啦,公众号回复 “

前端使用 Konva 实现可视化设计器(13)- 折线 - 最优路径应用【思路篇】

这一章把直线连接改为折线连接,沿用原来连接点的关系信息。关于折线的计算,使用的是开源的 AStar 算法进行路径规划,启发方式为 曼哈顿距离,且不允许对角线移动。 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue 哟~ github源码 gitee源码 示