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

可以做360度全景图的网站/seo最好的工具

可以做360度全景图的网站,seo最好的工具,百度seo网站排名,大连市建委培训官方网站通过一个完整的Spring Boot项目演示如何用Redis实现简单的API限流功能。我们将从零开始搭建项目。 一、环境准备 1.1 开发环境要求 JDK 1.8IntelliJ IDEA(推荐)Redis 5.0(本地安装)Postman(测试用) 1.2…

通过一个完整的Spring Boot项目演示如何用Redis实现简单的API限流功能。我们将从零开始搭建项目。

一、环境准备

1.1 开发环境要求

  • JDK 1.8+
  • IntelliJ IDEA(推荐)
  • Redis 5.0+(本地安装)
  • Postman(测试用)

1.2 创建SpringBoot项目

使用IDEA创建新项目,选择:

  • Spring Web
  • Spring Data Redis (Lettuce)
  • Lombok

二、基础配置

2.1 添加Redis配置

# application.yml
spring:redis:host: localhostport: 6379

2.2 Redis配置类

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());return template;}
}

三、核心代码实现

3.1 令牌桶算法Lua脚本

在resources目录创建rate_limiter.lua

-- 令牌桶算法实现
local key = KEYS[1]
local now = tonumber(ARGV[1])
local capacity = tonumber(ARGV[2])
local rate = tonumber(ARGV[3])
local requested = tonumber(ARGV[4])-- 获取当前令牌数
local data = redis.call("HMGET", key, "tokens", "last_time")
local tokens = tonumber(data[1]) or capacity
local last_time = tonumber(data[2]) or now-- 计算新增令牌
local delta = math.floor((now - last_time) * rate)
if delta > 0 thentokens = math.min(tokens + delta, capacity)last_time = now
end-- 判断是否允许请求
local result = 0
if tokens >= requested thentokens = tokens - requestedresult = 1
end-- 更新存储
redis.call("HMSET", key, "tokens", tokens, "last_time", last_time)
redis.call("EXPIRE", key, 86400)return result

3.2 限流服务类

@Service
@RequiredArgsConstructor
public class RateLimitService {private final RedisTemplate<String, Object> redisTemplate;// 加载Lua脚本private static final DefaultRedisScript<Long> REDIS_SCRIPT;static {REDIS_SCRIPT = new DefaultRedisScript<>();REDIS_SCRIPT.setLocation(new ClassPathResource("rate_limiter.lua"));REDIS_SCRIPT.setResultType(Long.class);}/*** 尝试获取令牌* @param key 限流key* @param capacity 桶容量* @param rate 令牌生成速率(个/秒)* @param requested 请求令牌数* @return 是否允许请求*/public boolean tryAcquire(String key, int capacity, double rate, int requested) {Long result = redisTemplate.execute(REDIS_SCRIPT,Collections.singletonList(key),Instant.now().getEpochSecond(),capacity,rate,requested);return result != null && result == 1;}
}

3.3 自定义限流注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimit {String key() default "";       // 限流key前缀int capacity() default 100;    // 桶容量double rate() default 10.0;    // 令牌生成速率int permits() default 1;       // 每次请求消耗令牌数
}

3.4 切面实现

@Aspect
@Component
@RequiredArgsConstructor
public class RateLimitAspect {private final RateLimitService rateLimitService;@Around("@annotation(rateLimit)")public Object checkLimit(ProceedingJoinPoint joinPoint, RateLimit rateLimit) throws Throwable {String key = buildKey(joinPoint, rateLimit);boolean allow = rateLimitService.tryAcquire(key,rateLimit.capacity(),rateLimit.rate(),rateLimit.permits());if (!allow) {throw new RuntimeException("请求太频繁,请稍后再试!");}return joinPoint.proceed();}private String buildKey(ProceedingJoinPoint joinPoint, RateLimit rateLimit) {MethodSignature signature = (MethodSignature) joinPoint.getSignature();return "rate_limit:" + (rateLimit.key().isEmpty() ? signature.getMethod().getName() : rateLimit.key());}
}

四、使用示例

4.1 创建测试Controller

@RestController
public class TestController {@RateLimit(key = "testApi", capacity = 5, rate = 1)@GetMapping("/test")public String testApi() {return "请求成功!当前时间:" + LocalDateTime.now();}
}

4.2 异常处理

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(RuntimeException.class)public ResponseEntity<String> handleLimit(RuntimeException ex) {return ResponseEntity.status(429).body(ex.getMessage());}
}

五、测试验证

5.1 使用Postman测试

  1. 快速连续访问 http://localhost:8080/test
  2. 观察响应结果变化:

正常响应:

"请求成功!当前时间:2024-05-20T15:30:45.123"

限流响应:

{"status": 429,"message": "请求太频繁,请稍后再试!"
}

5.2 测试结果预期

请求次数结果
1-5成功
6-10部分失败
后续请求每秒1次成功

六、常见问题解答

Q1:Redis宕机了怎么办?
A:可添加本地限流作为备用方案(推荐使用Guava的RateLimiter)

Q2:如何区分不同用户?
A:在key中加入用户ID:@RateLimit(key = "user_#{userId}")

Q3:如何修改限流规则?
A:直接修改注解参数即可立即生效

七、完整项目结构

rate-limiter-demo
├── src/main/java
│   └── com
│       └── example
│           ├── config/RedisConfig.java
│           ├── service/RateLimitService.java
│           ├── aspect/RateLimitAspect.java
│           ├── annotation/RateLimit.java
│           ├── controller/TestController.java
│           └── exception/GlobalExceptionHandler.java
├── src/main/resources
│   ├── rate_limiter.lua
│   └── application.yml
http://www.whsansanxincailiao.cn/news/30289404.html

相关文章:

  • 外贸做那种网站/百度官网app下载
  • 韶关微网站建设/软文素材
  • 网站 全屏幻灯片/店铺运营
  • 网站备案 写共享可以吗/万网官网域名注册
  • wordpress建设资源站点插件/搜索引擎优化的简称
  • 本地网站搭建工具/seo有些什么关键词
  • emlog与wordpress区别/西安seo网络优化公司
  • 做英文网站多钱/2023知名品牌营销案例100例
  • 温州网站建设案例/最新黑帽seo培训
  • 可以做点赞的网站/关键词查询网址
  • 做企业网站哪家公司专业/网络广告代理
  • 东莞疫情最新动态/seo优化服务
  • 张家界酒店网站建设/网络营销乐云seo
  • 网站建设优化推广排名/百度助手免费下载
  • 中文域名的网站有哪些/优化方案怎么写
  • 南山区网站建设公司/优化外包哪里好
  • 做网站必须知道的问题/合肥seo整站优化
  • 安康网站开发公司/营销方案怎么写?
  • 南京网站开发联系南京乐识/如何做百度搜索推广
  • 宠物网站建设报告/搜索引擎优化的定义
  • 广州市增城区建设局网站是什么/百度快照收录
  • 广州微网站建设/做网站用什么编程软件
  • 专业建站公司建站系统/百度首页排名怎么做到
  • 如何选择建设网站类型/爱站网关键词搜索工具
  • 无货源电商怎么找货源/关键词seo报价
  • 百度网站介绍显示图片/重庆森林经典台词梁朝伟
  • wordpress建立手机网站/百度一下首页百度一下
  • 手机网站加速器/百度搜索风云榜明星
  • 为什么要建设营销型网站/品牌运营策划方案
  • 破解织梦做的网站/百度搜索风云榜排名