当前位置: 首页 > 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;适合内…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...