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

企业网站新模式官网首页入口百度

企业网站新模式,官网首页入口百度,中国建设银行青海省分行网站,wordpress淘宝联盟在 Java Spring Boot 项目中实现防抖(Debounce),主要用于防止短时间内重复触发操作(如按钮重复提交、搜索框频繁请求)。以下是几种实现方案: 方案 1:使用 Redis 实现分布式防抖(推荐…

在 Java Spring Boot 项目中实现防抖(Debounce),主要用于防止短时间内重复触发操作(如按钮重复提交、搜索框频繁请求)。以下是几种实现方案:


方案 1:使用 Redis 实现分布式防抖(推荐)

适合分布式环境,利用 Redis 的原子性和过期时间特性。

  1. 添加依赖

    xml

    复制

    下载

    运行

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
  2. 创建防抖工具类

    java

    复制

    下载

    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.ValueOperations;
    import java.util.concurrent.TimeUnit;@Component
    public class DebounceUtil {@Autowiredprivate RedisTemplate<String, String> redisTemplate;/*** 检查是否允许操作(防抖)* @param key 唯一标识(如:userId + 操作类型)* @param expireTime 防抖时间(毫秒)* @return true-允许操作, false-被限制*/public boolean checkAndSet(String key, long expireTime) {ValueOperations<String, String> ops = redisTemplate.opsForValue();// 使用 setIfAbsent 实现原子操作Boolean success = ops.setIfAbsent(key, "1", expireTime, TimeUnit.MILLISECONDS);return Boolean.TRUE.equals(success);}
    }
  3. 在 Controller 中使用

    java

    复制

    下载

    @RestController
    public class UserController {@Autowiredprivate DebounceUtil debounceUtil;@PostMapping("/submit")public ResponseEntity<String> submitOrder(@RequestParam String userId) {String debounceKey = "order_submit:" + userId; // 唯一键long debounceTime = 3000; // 3秒内防抖if (!debounceUtil.checkAndSet(debounceKey, debounceTime)) {return ResponseEntity.status(429).body("操作过于频繁,请稍后再试");}// 正常业务逻辑return ResponseEntity.ok("提交成功");}
    }

方案 2:基于本地缓存(单机适用)

使用 ConcurrentHashMap + ScheduledExecutorService 实现单机防抖。

java

复制

下载

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.Map;
import java.util.concurrent.*;@Component
public class LocalDebounceUtil {private final Map<String, Boolean> debounceMap = new ConcurrentHashMap<>();private ScheduledExecutorService scheduler;@PostConstructpublic void init() {scheduler = Executors.newSingleThreadScheduledExecutor();}@PreDestroypublic void destroy() {if (scheduler != null) scheduler.shutdown();}/*** 检查并设置防抖状态* @param key 唯一标识* @param delay 防抖时间(毫秒)* @return true-允许操作*/public boolean checkAndSet(String key, long delay) {if (debounceMap.containsKey(key)) {return false; // 在冷却期内}debounceMap.put(key, true);// 延迟后移除keyscheduler.schedule(() -> debounceMap.remove(key), delay, TimeUnit.MILLISECONDS);return true;}
}

方案 3:AOP + 注解实现(优雅封装)

通过自定义注解统一管理防抖逻辑。

  1. 定义注解

    java

    复制

    下载

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Debounce {long value() default 3000; // 默认防抖时间String key() default "";   // 自定义Key(支持SpEL)
    }
  2. 实现AOP切面

    java

    复制

    下载

    @Aspect
    @Component
    public class DebounceAspect {@Autowiredprivate DebounceUtil debounceUtil; // 复用前面的Redis工具类@Around("@annotation(debounceAnnotation)")public Object debounce(ProceedingJoinPoint joinPoint, Debounce debounceAnnotation) throws Throwable {String key = generateKey(joinPoint, debounceAnnotation);long expireTime = debounceAnnotation.value();if (!debounceUtil.checkAndSet(key, expireTime)) {throw new RuntimeException("操作过于频繁");}return joinPoint.proceed();}private String generateKey(ProceedingJoinPoint joinPoint, Debounce annotation) {// 从注解获取key(支持SpEL表达式)String keyExpr = annotation.key();if (!StringUtils.isEmpty(keyExpr)) {return parseSpEL(joinPoint, keyExpr);}// 默认生成方法签名作为keyMethodSignature signature = (MethodSignature) joinPoint.getSignature();return signature.getMethod().toString();}private String parseSpEL(ProceedingJoinPoint joinPoint, String spEL) {// 实现SpEL解析(略)}
    }
  3. 在Service/Controller中使用

    java

    复制

    下载

    @Service
    public class OrderService {@Debounce(key = "#userId", value = 5000) // 5秒防抖,key=userIdpublic void submitOrder(String userId) {// 业务逻辑}
    }

关键注意事项:

  1. Key 设计原则

    • 确保唯一性(如:用户ID + 操作类型

    • 分布式环境需用 Redis 等共享存储

    • 避免 Key 冲突(添加业务前缀)

  2. 防抖时间选择

    • 前端操作:300ms~1000ms(如搜索框)

    • 提交类操作:1000ms~5000ms(如订单提交)

  3. 用户体验优化

    • 返回明确错误信息(HTTP 429 Too Many Requests)

    • 结合前端防抖(如限制按钮点击状态)

  4. 性能考虑

    • Redis 方案需评估连接开销

    • 高并发场景用 setIfAbsent 保证原子性


前端辅助防抖(推荐组合使用)

后端防抖是最后防线,前端也应做基础拦截:

javascript

复制

下载

// Vue示例(使用lodash)
import { debounce } from 'lodash';export default {methods: {submitOrder: debounce(function() {axios.post('/api/submit', ...)}, 1000) // 1秒内仅触发一次}
}

总结

  • 分布式场景:Redis + AOP 注解(方案1+3)

  • 单机应用:本地缓存(方案2)

  • 最佳实践:前后端同时实现防抖,后端以 Redis 方案为主

http://www.laogonggong.com/news/47696.html

相关文章:

  • 地名网站安全建设方案58同城网站推广
  • 外贸网站建设渠道电商网站开发平台有哪些
  • 镇江网站建设价格互动营销案例100
  • 做网站的内容资源企业网络推广服务
  • 怎样制作网站的步骤软文世界平台
  • 扬州外贸网站建设广州代运营公司有哪些
  • 各行各业网站建设独立济南网站seo哪家公司好
  • 东莞网站建设dgjcwlapp下载注册量推广平台
  • 一级a做爰片不卡的网站营销型网站建设价格
  • 跨境电商有哪几个平台seo的基本步骤顺序正确的是
  • 黄骅做网站_黄骅昊信科技|黄骅网站|黄骅网站开发|黄骅微信|黄骅网络推广图片
  • 怎么让别人找你做网站百度站长平台有哪些功能
  • 网站建设投资大概每年需要多少钱搜索seo优化
  • 做PS的赚钱的网站2023年最新时政热点
  • 做网站怎么找公司百度搜索指数入口
  • wap网站开发教程百度快照网站
  • 科普文章在那个网站做seo搜索铺文章
  • 国外互动网站合肥优化
  • 做直播网站用什么网上空间好电商关键词seo排名
  • 遵义城乡住房建设厅网站怎么做网络推广优化
  • 衢州在建火车站今天宣布疫情最新消息
  • html5怎么做二手网站鸡西seo顾问
  • 建网站赚钱吗产品营销策略有哪些
  • 博彩网站开发人员犯法吗创建app平台
  • 网站改版建设情况的汇报东莞疫情最新通知
  • 如何给网站做排名优化怎么知道自己的域名
  • 怎样建设网站360搜索推广
  • 上海市建设质量协会网站网站发布与推广怎么写
  • 基层政府网站建设论文摘要谷歌google 官网下载
  • 郑州网站建设铁哥们汕头网站建设方案优化