package com.example.demo.config; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.util.concurrent.TimeUnit; /** * 本地限流工具类(基于Guava Cache) */ public class RateLimitUtil { // 缓存:key=限流标识(用户ID/IP),value=占位符(无实际意义) private static final Cache RATE_LIMIT_CACHE = CacheBuilder.newBuilder() .expireAfterWrite(3, TimeUnit.SECONDS) // 3秒后自动过期(时间窗口) .maximumSize(5000) // 最大缓存容量(防止内存溢出,根据用户量调整) .build(); /** * 判断是否允许请求 * @param key 限流唯一标识(如用户ID、IP) * @return true=允许请求,false=限流中 */ public static boolean isAllowed(String key) { // 1. 尝试从缓存获取key,存在则说明3秒内已请求过(限流) if (RATE_LIMIT_CACHE.getIfPresent(key) != null) { return false; } // 2. 缓存中不存在,存入缓存(占位符用new Object()即可) RATE_LIMIT_CACHE.put(key, new Object()); return true; } /** * 手动移除限流标识(如接口执行失败时,释放限流) * @param key 限流唯一标识 */ public static void removeKey(String key) { RATE_LIMIT_CACHE.invalidate(key); } }