当前位置: 首页 > news >正文

你了解哪些Java限流算法?

大家好,我是锋哥。今天分享关于【你了解哪些Java限流算法?】面试题。希望对大家有帮助;

你了解哪些Java限流算法?

1000道 互联网大厂Java工程师 精选面试题-Java资源分享网

Java 中常用的限流算法主要有以下几种,它们广泛应用于处理流量控制、API请求限制等场景:

1. 令牌桶算法(Token Bucket)

令牌桶算法是限流中最常用的一种方法。其基本思想是:

  • 系统按固定速率向桶中放入令牌,每次请求需要消耗一个令牌。
  • 如果桶中没有足够的令牌,请求会被拒绝或者被延迟处理。
  • 如果令牌桶的容量大于实际请求速率,系统允许突发流量(超过速率的流量)。

特点

  • 支持突发流量。
  • 限制速率比较平滑,可以动态调整。

实现方式

  • 使用一个线程定时向桶中放入令牌。
  • 请求到达时,检查令牌桶是否有令牌。
public class TokenBucket {private final long capacity;private final long refillInterval;private long availableTokens;private long lastRefillTime;public TokenBucket(long capacity, long refillInterval) {this.capacity = capacity;this.refillInterval = refillInterval;this.availableTokens = capacity;this.lastRefillTime = System.currentTimeMillis();}public synchronized boolean acquire() {long now = System.currentTimeMillis();long elapsedTime = now - lastRefillTime;long tokensToAdd = elapsedTime / refillInterval;availableTokens = Math.min(capacity, availableTokens + tokensToAdd);lastRefillTime = now;if (availableTokens > 0) {availableTokens--;return true;}return false;}
}

2. 漏斗算法(Leaky Bucket)

漏斗算法通过一个固定容量的桶来控制请求速率。桶中有一定的容量,固定的速率会“漏掉”桶中的水,水(请求)按一定速率流出。

特点

  • 控制流量的输出速率平稳。
  • 不允许突发流量,所有流量都按固定速率流出。

实现方式

  • 每次请求到来时,检查桶中的水量(请求数),如果桶已经满了,就拒绝请求。
  • 否则允许请求进入桶,按固定速率流出。
public class LeakyBucket {private final long capacity;private final long leakRate;private long waterLevel;private long lastLeakTime;public LeakyBucket(long capacity, long leakRate) {this.capacity = capacity;this.leakRate = leakRate;this.waterLevel = 0;this.lastLeakTime = System.currentTimeMillis();}public synchronized boolean acquire() {long now = System.currentTimeMillis();long elapsedTime = now - lastLeakTime;long leakedWater = elapsedTime / leakRate;waterLevel = Math.max(0, waterLevel - leakedWater);lastLeakTime = now;if (waterLevel < capacity) {waterLevel++;return true;}return false;}
}

3. 计数窗口算法(Fixed Window Counter)

计数窗口算法是最简单的一种限流算法,它将时间划分为多个固定的时间窗口,每个时间窗口内可以接受一定数量的请求。

特点

  • 简单易理解。
  • 容易受到“窗口切分”的影响,可能会在窗口的边界出现突发流量。

实现方式

  • 每个窗口内计数器限制请求次数。
  • 请求到来时,检查当前时间窗口是否超过了限制。
public class FixedWindowCounter {private final int limit;private int count;private long lastWindowStartTime;public FixedWindowCounter(int limit) {this.limit = limit;this.count = 0;this.lastWindowStartTime = System.currentTimeMillis();}public synchronized boolean acquire() {long currentTime = System.currentTimeMillis();if (currentTime - lastWindowStartTime >= 1000) { // New windowcount = 0;lastWindowStartTime = currentTime;}if (count < limit) {count++;return true;}return false;}
}

4. 滑动窗口算法(Sliding Window Log)

滑动窗口算法是对固定窗口的改进,避免了固定窗口中产生的突发流量问题。它通过记录每个请求的时间戳,然后根据时间戳来判断请求是否超出了时间窗口。

特点

  • 较为精确地控制请求数量,避免了固定窗口的突发流量问题。
  • 实现相对复杂。

实现方式

  • 使用队列记录每个请求的时间戳,当新请求到来时,去除过期的时间戳并检查当前窗口内的请求数量。
import java.util.LinkedList;public class SlidingWindowLog {private final int limit;private final long windowSize;private LinkedList<Long> requests;public SlidingWindowLog(int limit, long windowSize) {this.limit = limit;this.windowSize = windowSize;this.requests = new LinkedList<>();}public synchronized boolean acquire() {long currentTime = System.currentTimeMillis();while (!requests.isEmpty() && currentTime - requests.peekFirst() >= windowSize) {requests.pollFirst();}if (requests.size() < limit) {requests.addLast(currentTime);return true;}return false;}
}

5. Redis限流

使用 Redis 进行限流是分布式环境中常见的一种做法,主要使用 Redis 的 INCREXPIRE 命令来实现。

特点

  • 适用于分布式系统。
  • 可扩展性强。

实现方式

  • 使用 Redis 存储请求计数,设置过期时间。
  • 请求时进行计数和判断。
public class RedisRateLimiter {private final String redisKey;private final int limit;private final long period;private final Jedis jedis;public RedisRateLimiter(String redisKey, int limit, long period, Jedis jedis) {this.redisKey = redisKey;this.limit = limit;this.period = period;this.jedis = jedis;}public boolean acquire() {long currentTime = System.currentTimeMillis() / 1000;String key = redisKey + ":" + currentTime;Long count = jedis.incr(key);if (count == 1) {jedis.expire(key, (int) period);}return count <= limit;}
}

6. 漏桶 + 令牌桶混合

某些场景中,结合漏桶算法和令牌桶算法可以平衡处理流量控制。

特点

  • 结合两种算法的优点,既支持突发流量,又能够平稳流量。

这些限流算法各有优缺点,适用于不同的场景。令牌桶算法通常用于需要支持突发流量的场景,漏桶算法适用于对流量的平滑控制,而计数窗口和滑动窗口算法适合于较为简单的应用场景。对于分布式应用,使用 Redis 等中间件进行限流会更有效。

相关文章:

你了解哪些Java限流算法?

大家好&#xff0c;我是锋哥。今天分享关于【你了解哪些Java限流算法?】面试题。希望对大家有帮助&#xff1b; 你了解哪些Java限流算法? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Java 中常用的限流算法主要有以下几种&#xff0c;它们广泛应用于处理流量控…...

【漫话机器学习系列】065.梯度(Gradient)

梯度&#xff08;Gradient&#xff09; 在数学和机器学习中&#xff0c;梯度是一个向量&#xff0c;用来表示函数在某一点的变化方向和变化率。它是多变量函数的一阶偏导数的组合。 梯度的定义 设有一个标量函数 &#xff0c;它对 ​ 是可微的&#xff0c;则该函数在某一点的…...

BswM(基础软件管理)详解

BswM&#xff08;基础软件管理&#xff09;详解 BswM&#xff08;Basic Software Manager&#xff09; 是 AUTOSAR BSW 的核心模块之一&#xff0c;负责协调基础软件&#xff08;BSW&#xff09;各模块的行为&#xff0c;根据系统状态、规则或事件动态配置其他模块。其设计目标…...

上位机知识篇---GitGitHub

文章目录 前言Git&GitHub是什么&#xff1f;GitGitHub Git和GitHub的区别定位功能使用方式开源协作 Git常用命令操作1. 配置2. 仓库操作3. 文件操作4. 分支与合并5.远程操作6.撤销更改7.查看历史 GitHub常用操作1.创建仓库2.Fork仓库3.Pull Request4.Issue跟踪5.代码审查 G…...

网站快速收录:提高页面加载速度的重要性

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/32.html 网站快速收录中&#xff0c;提高页面加载速度具有极其重要的意义。以下从多个方面详细阐述其重要性&#xff1a; 一、提升用户体验 减少用户等待时间&#xff1a;页面加载速度直接…...

Vue.js组件开发-实现全屏背景图片滑动切换特效

使用 Vue 实现全屏背景图片滑动切换特效的详细步骤、代码、注释和使用说明。 步骤 创建 Vue 项目&#xff1a;使用 Vue CLI 创建一个新的 Vue 项目。准备图片资源&#xff1a;准备好要用于背景切换的图片&#xff0c;并将它们放在项目的合适目录下。编写 HTML 结构&#xff1…...

DeepSeek r1本地安装全指南

环境基本要求 硬件配置 需要本地跑模型&#xff0c;兼顾质量、性能、速度以及满足日常开发需要&#xff0c;我们需要准备以下硬件&#xff1a; CPU&#xff1a;I9内存&#xff1a;128GB硬盘&#xff1a;3-4TB 最新SSD&#xff0c;C盘确保有400GB&#xff0c;其它都可划成D盘…...

LitGPT - 20多个高性能LLM,具有预训练、微调和大规模部署的recipes

文章目录 一、关于 LitGPT二、快速启动安装LitGPT高级安装选项 从20多个LLM中进行选择 三、工作流程1、所有工作流程2、微调LLM3、部署LLM4、评估LLM5、测试LLM6、预训练LLM7、继续预训练LLM 四、最先进的功能五、训练方法示例 六、项目亮点教程 一、关于 LitGPT LitGPT 用于 …...

deepseek R1 14b显存占用

RTX2080ti 11G显卡&#xff0c;模型7b速度挺快&#xff0c;试试14B也不错。 7B显存使用5.6G&#xff0c;14B显存刚好够&#xff0c;出文字速度差不多。 打算自己写个移动宽带的IPTV播放器&#xff0c;不知道怎么下手&#xff0c;就先问他了。...

无用知识研究:对std::common_type以及问号表达式类型的理解

先说结论&#xff1a; 如果问号表达式能编译通过&#xff0c;那么std::common_type就能通过。因为common_type的底层依赖的就是?: common_type的实现里&#xff0c;利用了问号表达式&#xff1a;ternary conditional operator (?:) https://stackoverflow.com/questions/14…...

MapReduce概述

目录 1. MapReduce概述2. MapReduce的功能2.1 数据划分和计算任务调度2.2 数据/代码互定位2.3 系统优化2.4 出错检测和恢复 3. MapReduce处理流程4. MapReduce编程基础参考 1. MapReduce概述 MapReduce是面向大数据并行处理的计算模型、框架和平台:   1. 基于集群的高性能并行…...

循环神经网络(RNN)+pytorch实现情感分析

目录 一、背景引入 二、网络介绍 2.1 输入层 2.2 循环层 2.3 输出层 2.4 举例 2.5 深层网络 三、网络的训练 3.1 训练过程举例 1&#xff09;输出层 2&#xff09;循环层 3.2 BPTT 算法 1&#xff09;输出层 2&#xff09;循环层 3&#xff09;算法流程 四、循…...

Mac cursor设置jdk、Maven版本

基本配置 – Cursor 使用文档 首先是系统用户级别的设置参数&#xff0c;运行cursor&#xff0c;按下ctrlshiftp&#xff0c;输入Open User Settings(JSON)&#xff0c;在弹出的下拉菜单中选中下面这样的&#xff1a; 在打开的json编辑器中追加下面的内容&#xff1a; {"…...

WPS数据分析000005

目录 一、数据录入技巧 二、一维表 三、填充柄 向下自动填充 自动填充选项 日期填充 星期自定义 自定义序列 1-10000序列 四、智能填充 五、数据有效性 出错警告 输入信息 下拉列表 六、记录单 七、导入数据 ​编辑 八、查找录入 会员功能 Xlookup函数 VL…...

CTF从入门到精通

文章目录 背景知识CTF赛制 背景知识 CTF赛制 1.web安全:通过浏览器访问题目服务器上的网站&#xff0c;寻找网站漏洞(sql注入&#xff0c;xss&#xff08;钓鱼链接&#xff09;,文件上传&#xff0c;包含漏洞&#xff0c;xxe&#xff0c;ssrf&#xff0c;命令执行&#xff0c…...

Flutter使用Flavor实现切换环境和多渠道打包

在Android开发中通常我们使用flavor进行多渠道打包&#xff0c;flutter开发中同样有这种方式&#xff0c;不过需要在原生中配置 具体方案其实flutter官网个了相关示例&#xff08;https://docs.flutter.dev/deployment/flavors&#xff09;,我这里记录一下自己的操作 Android …...

Springboot如何使用面向切面编程AOP?

Springboot如何使用面向切面编程AOP? 在 Spring Boot 中使用面向切面编程&#xff08;AOP&#xff09;非常简单&#xff0c;Spring Boot 提供了对 AOP 的自动配置支持。以下是详细的步骤和示例&#xff0c;帮助你快速上手 Spring Boot 中的 AOP。 1. 添加依赖 首先&#xff…...

51单片机(STC89C52)开发:点亮一个小灯

软件安装&#xff1a; 安装开发板CH340驱动。 安装KEILC51开发软件&#xff1a;C51V901.exe。 下载软件&#xff1a;PZ-ISP.exe 创建项目&#xff1a; 新建main.c 将main.c加入至项目中&#xff1a; main.c:点亮一个小灯 #include "reg52.h"sbit LED1P2^0; //P2的…...

基于MinIO的对象存储增删改查

MinIO是一个高性能的分布式对象存储服务。Python的minio库可操作MinIO&#xff0c;包括创建/列出存储桶、上传/下载/删除文件及列出文件。 查看帮助信息 minio.exe --help minio.exe server --help …...

Ubuntu Server 安装 XFCE4桌面

Ubuntu Server没有桌面环境&#xff0c;一些软件有桌面环境使用起来才更加方便&#xff0c;所以我尝试安装桌面环境。常用的桌面环境有&#xff1a;GNOME、KDE Plasma、XFCE4等。这里我选择安装XFCE4桌面环境&#xff0c;主要因为它是一个极轻量级的桌面环境&#xff0c;适合内…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 &#xff09; 缓存工作原理分析 在了解了本地缓存和远程缓存之后&#xff0c;我们来探究缓存是如何工作的。以计算文件的哈希串为例&#xff0c;若后续运行任务时文件哈希串未变&#xff0c;系统会直接使用对应的输出和制品文件。 2 …...