前后端实现防抖节流实现
在前端和 Java 后端中实现防抖(Debounce)和节流(Throttle)主要用于减少频繁请求或事件触发对系统的压力。前端和后端的实现方式有些不同,以下是两种方法的具体实现:
1. 前端实现防抖和节流
在前端中,可以使用 JavaScript 实现防抖和节流,用于控制频繁触发的事件(如键盘输入、滚动、窗口调整大小等)。
前端防抖(Debounce)
防抖的原理是:在事件触发后等待一定时间,如果在这段时间内又触发了同样的事件,则重新计时。防抖常用于搜索框输入等场景,以减少请求次数。
// 防抖函数
function debounce(func, delay) {let timer;return function(...args) {clearTimeout(timer); // 每次触发都清除之前的计时器timer = setTimeout(() => func.apply(this, args), delay);};
}// 使用防抖
const handleInput = debounce((event) => {console.log("Input value:", event.target.value);// 这里执行请求或其他操作
}, 500);// 绑定到输入框的输入事件
document.getElementById("searchInput").addEventListener("input", handleInput);
在这个例子中,handleInput 只有在用户停止输入超过 500 毫秒后才会被执行。
前端节流(Throttle)
节流的原理是:在一定时间间隔内只允许一次操作,忽略其余操作。节流常用于滚动事件、按钮点击等场景,减少事件触发频率。
// 节流函数
function throttle(func, interval) {let lastTime = 0;return function(...args) {const now = Date.now();if (now - lastTime >= interval) {func.apply(this, args);lastTime = now;}};
}// 使用节流
const handleScroll = throttle(() => {console.log("Scrolled");// 这里执行操作,如懒加载
}, 1000);// 绑定到滚动事件
window.addEventListener("scroll", handleScroll);
在这个例子中,handleScroll 最多每隔 1000 毫秒触发一次。
2. Java 后端实现防抖和节流
在 Java 后端中,可以通过请求次数限制、缓存等方式实现防抖和节流,常用于限制接口访问频率或控制资源消耗。
后端防抖(Debounce)
在后端实现防抖可以通过 请求时间检测 或 缓存 来实现。例如,如果用户在一定时间内发送了多次相同请求,可以忽略后续请求。
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;public class DebounceService {private ConcurrentHashMap<String, Long> requestMap = new ConcurrentHashMap<>();// 防抖处理public boolean isAllowed(String userId, long debounceTimeMs) {long now = System.currentTimeMillis();Long lastRequestTime = requestMap.get(userId);if (lastRequestTime == null || now - lastRequestTime > debounceTimeMs) {requestMap.put(userId, now);return true; // 允许请求} else {return false; // 拒绝请求}}
}
在这个示例中,isAllowed 方法在一定时间内只允许一个请求,通过检查上次请求时间与当前时间的差值实现防抖。
后端节流(Throttle)
后端的节流通常通过令牌桶(Token Bucket)算法、计数器等方式实现。下面是使用 令牌桶 的简单示例,每隔固定时间生成一定数量的请求令牌,超出限制的请求会被拒绝。
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;public class ThrottleService {private final Semaphore semaphore;// 构造函数传入限制请求的数量public ThrottleService(int maxRequestsPerSecond) {this.semaphore = new Semaphore(maxRequestsPerSecond);}public boolean tryAcquire() {return semaphore.tryAcquire();}public void release() {semaphore.release();}
}// 使用节流服务
public class ApiController {private final ThrottleService throttleService = new ThrottleService(5); // 每秒最多5个请求public void handleRequest(String userId) {if (throttleService.tryAcquire()) {try {// 处理请求逻辑System.out.println("Request allowed for user: " + userId);} finally {throttleService.release();}} else {System.out.println("Request denied for user: " + userId);}}
}
在这个示例中,ThrottleService 每次允许的最大请求数为 5,超出限制的请求会被拒绝。
总结
- 前端防抖适用于减少频繁触发的用户输入事件,前端节流用于限制连续触发的操作(如滚动、点击)。
- 后端防抖通过记录上次请求时间控制一定时间内只允许一个请求。
- 后端节流通过设置最大请求量的限制,每秒只允许固定次数的请求。
这些方法可以帮助优化系统性能,避免因频繁请求带来的负担。选择合适的防抖或节流方式,能够有效平衡用户体验和系统性能。

相关文章:
前后端实现防抖节流实现
在前端和 Java 后端中实现防抖(Debounce)和节流(Throttle)主要用于减少频繁请求或事件触发对系统的压力。前端和后端的实现方式有些不同,以下是两种方法的具体实现: 1. 前端实现防抖和节流 在前端中&…...
【笔记】算法记录
1、求一个数的素因子(试除法) // 获取一个数的所有素因子 set<int> getPrimeFactors(int num) {set<int> primeFactors;for (int i 2; i * i < num; i) {while (num % i 0) {primeFactors.insert(i);num / i;}}if (num > 1) {prime…...
【网络云SRE运维开发】2025第2周-每日【2025/01/08】小测-【第8章 STP生成树协议】理论和实操解析
文章目录 一、选择题二、理论题三、实操题 【网络云SRE运维开发】2025第2周-每日【2025/01/08】小测-【第8章 STP生成树协议】理论和实操解析 一、选择题 生成树协议的主要作用是 B. 防止网络环路解释:生成树协议(STP)的主要目的是防止网络中…...
git push -f 指定分支
要将本地代码推送到指定的远程分支,你可以使用以下步骤和命令: 确认远程仓库: 确保你的本地仓库已经与远程仓库关联。你可以使用以下命令查看当前的远程仓库状态: git remote -v查看本地分支: 使用命令查看当前存在的本…...
CTF知识点总结(二)
异或注入:两个条件相同(同真或同假)即为假。 http://120.24.86.145:9004/1ndex.php?id1^(length(union)!0)-- 如上,如果union被过滤,则 length(union)!0 为假,那么返回页面正常。 2|0updatexml() 函数报…...
解决Edge打开PDF总是没有焦点
【问题描述】 使用Edge浏览器作为默认PDF阅读器打开本地PDF文件,Edge窗口总是不获得焦点,而是在任务栏以橙色显示,需要再手动点击一次才能查看文件内容。 本强迫症来治一治这个问题! 【解决方法】 GPT老师指出问题出在Edge的启动…...
69.基于SpringBoot + Vue实现的前后端分离-家乡特色推荐系统(项目 + 论文PPT)
项目介绍 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括家乡特色推荐的网络应用,在外国家乡特色推荐系统已经是很普遍的方式,不过国内的管理网站可能还处于起步阶段。家乡特色推荐系统采用java技术&…...
计算机视觉目标检测-DETR网络
目录 摘要abstractDETR目标检测网络详解二分图匹配和损失函数 DETR总结总结 摘要 DETR(DEtection TRansformer)是由Facebook AI提出的一种基于Transformer架构的端到端目标检测方法。它通过将目标检测建模为集合预测问题,摒弃了锚框设计和非…...
《自动驾驶与机器人中的SLAM技术》ch1:自动驾驶
目录 1.1 自动驾驶技术 1.2 自动驾驶中的定位与地图 1.1 自动驾驶技术 1.2 自动驾驶中的定位与地图 L2 在技术实现上会更倾向于实时感知,乃至可以使用感知结果直接构建鸟瞰图(bird eye view, BEV),而 L4 则依赖离线地图。 高精地…...
【UE5 C++课程系列笔记】23——多线程基础——AsyncTask
目录 概念 函数说明 注意事项 (1)线程安全问题 (2)依赖特定线程执行的任务限制 (3)任务执行顺序和时间不确定性 使用示例 概念 AsyncTask 允许开发者将一个函数或者一段代码逻辑提交到特定的线程去执…...
基于Python的音乐播放器 毕业设计-附源码73733
摘 要 本项目基于Python开发了一款简单而功能强大的音乐播放器。通过该音乐播放器,用户可以轻松管理自己的音乐库,播放喜爱的音乐,并享受音乐带来的愉悦体验。 首先,我们使用Python语言结合相关库开发了这款音乐播放器。利用Tkin…...
cursor vip
https://cursor.jeter.eu.org?pf7f4f3fab0af4119bece19ff4a4360c3 可以直接复制命令使用git bash执行即可 命令: bash <(curl -Lk https://gitee.com/kingparks/cursor-vip/releases/download/latest/ic.sh) f7f4f3fab0af4119bece19ff4a4360c3 等待执行完成后…...
Docker部署项目,Mysql数据库总是宕机并且上传数据全部被删除了
刚开始排查原因我以为是一些内存占用问题的原因,后来查看数据库日志发现有多个异常ip尝试连接数据库并且也连接成功了随后数据库就被异常关闭了,然后我就重启容器远程连接数据库发现数据全没了,又在数据库中找到了如下内容: All y…...
C++ 复习总结记录六
C 复习总结记录六 模板初阶主要内容 1、泛型编程 2、函数模板 3、类模板 4、STL 简介 一 泛型编程 如何实现一个通用的交换函数 void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right…...
spring boot 集成 knife4j
1、knife4j介绍以及环境介绍 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名knife4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍!其底层是对Springfox的封装,使用方式也和Springfox一致,只是对接口…...
WordPress静态缓存插件WP Super Cache与 WP Fastest Cache
引言 WordPress是一款开源的内容管理系统(CMS),最初作为博客平台开发,现已发展成为一个功能强大的建站工具,支持创建各种类型的网站,包括企业网站、在线商店、个人博客等。它具有用户友好的界面、丰富的插…...
Pytest钩子函数,测试框架动态切换测试环境
在软件测试中,测试环境的切换是个令人头疼的问题。不同环境的配置不同,如何高效切换测试环境成为许多测试开发人员关注的重点。你是否希望在运行测试用例时,能够动态选择测试环境,而不是繁琐地手动修改配置? Pytest 测…...
VUE3封装一个Hook
在 Vue 3 中,Composition API 让我们能够封装和复用代码逻辑,尤其是通过 setup 函数进行组件间的复用。为了提高代码的可复用性,我们可以把一些常见的 API 请求和状态管理逻辑封装到一个单独的 hook 中。 以下是一个简单的例子,我…...
【Spring Boot】Spring AOP 快速上手指南:开启面向切面编程新旅程
前言 🌟🌟本期讲解关于spring aop的入门介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不…...
HTML基础入门——简单网页页面
目录 一,网上转账电子账单 编辑 1,所利用到的标签 2,代码编写 3,运行结果 二,李白诗词 1,所用到的标签 2,照片的编辑 3,代码编写 4,运行结果 一,网…...
从 0 到 1 搭建美股回测数据体系:API 获取 + 清洗 + 校验完整方案
在量化交易策略开发与回测过程中,数据质量直接决定回测结果的有效性。美股市场行情数据具有体量大、粒度丰富等特点,时间戳不统一、字段格式不一致、数据缺失 / 重复等问题,都会导致回测结果严重偏离真实表现。因此,标准化数据需求…...
某大厂员工爆料:同事裁员被赔了30w,结果他当场大哭!问了才知道,他在深圳每月要还3万房贷,还有孩子补习班每月1.5万
听说没,大厂一个哥们被裁,赔了30万,当场就哭了。你以为他是舍不得公司?拉倒吧。问了才知道,深圳房贷一个月3万,孩子补习班1万5。加起来4万5,每个月一睁眼就欠银行和培训班一屁股债。这30万&…...
IC Hack Badge嵌入式驱动开发:LED扫描与FreeRTOS多任务实战
1. IC Hack Badge 嵌入式驱动开发深度解析 IC Hack Badge 是为 2025 年 IC Hack 硬件黑客马拉松定制的开源 PCB 电子徽章,其核心价值不仅在于物理形态的趣味性,更在于其作为嵌入式底层开发教学与实战平台的工程意义。该徽章采用主流低成本 MCU 架构&…...
CAN总线数字信号特性与抗干扰技术解析
1. CAN总线信号本质解析CAN总线采用数字信号传输机制,这一点可以从其物理层特性得到明确验证。在CAN总线的差分信号线上,实际传输的是经过编码的数字电平信号(显性电平与隐性电平),而非连续变化的模拟电压。这种设计从…...
避坑指南:天地图加载GeoJSON绘制省市区划时,你可能遇到的3个关键问题与解决方案
天地图加载GeoJSON绘制行政区划的三大核心难题与实战解决方案 当开发者尝试在天地图平台上叠加GeoJSON数据绘制行政区划时,往往会遇到一些意料之外的"坑"。这些问题不仅影响开发效率,更可能导致最终呈现效果与预期相差甚远。本文将聚焦三个最常…...
大模型幻觉问题:RAG检索增强与约束生成解决方案
GPTQ 和 AWQ 都是量化技术,它们有什么区别?在什么场景下选哪种? GPTQ:是一种基于二阶信息(海森矩阵)的层级量化方法,它通过计算权重对误差的敏感度,优先保留重要的权重。侧重于整体权…...
解锁毕业论文新姿势:好写作AI,你的学术“超级外挂”!
在学术的江湖里,毕业论文就像是那终极BOSS,每个学子都得独自面对,挑战重重。选题迷茫、文献浩如烟海、写作卡壳……这些问题是不是让你头疼不已?别怕,今天咱们就来揭秘一个学术界的“超级外挂”——好写作AI࿰…...
Fast JSON API 生成器系统:Rails 模板和自定义生成器终极指南 [特殊字符]
Fast JSON API 生成器系统:Rails 模板和自定义生成器终极指南 🚀 【免费下载链接】fast_jsonapi No Longer Maintained - A lightning fast JSON:API serializer for Ruby Objects. 项目地址: https://gitcode.com/gh_mirrors/fa/fast_jsonapi 欢…...
Linux设备驱动 -- RTC驱动移植DS1339
查看原理图RTC芯片采用的是DS1339芯片,这是达拉斯半导体公司的一款RTC芯片,使用I2C接口。 芯片接在RK3568的I2C5。 Linux内核支持DS1339 检索linux内核是否支持DS1339芯片驱动。 通过搜索可知到,Linux系统内核中已有达拉斯DS1339的驱动&#…...
别再吹牛了,% Vibe Coding 存在无法自洽的逻辑漏洞!氛
简介 langchain中提供的chain链组件,能够帮助我门快速的实现各个组件的流水线式的调用,和模型的问答 Chain链的组成 根据查阅的资料,langchain的chain链结构如下: $$Input \rightarrow Prompt \rightarrow Model \rightarrow Outp…...
