在Linux环境下,Swagger的API缓存策略优化可从服务端文档缓存、浏览器端资源缓存、后端数据缓存三个层面展开,结合Linux服务器特性(如内存、CPU、SSD)提升API文档加载速度与响应效率。
Swagger UI依赖/v3/api-docs接口获取OpenAPI规范文档,合理配置服务端缓存可减少重复生成文档的开销。
禁用开发环境缓存(快速生效)
在Spring Boot项目的application-dev.yml(开发环境配置文件)中,添加以下配置禁用Swagger缓存,确保每次请求都重新生成最新文档:
springdoc:
api-docs:
cache:
disabled: true # 关闭API文档缓存
swagger-ui:
enabled: true # 启用Swagger UI
此配置适用于开发阶段,避免因注解修改未生效导致的文档滞后问题。
自定义缓存策略(平衡性能与实时性)
若需保留缓存但控制其有效期,可通过springdoc.cache.ttl参数设置缓存时间(单位:毫秒)。例如,设置10分钟缓存:
springdoc:
api-docs:
cache:
ttl: 600000 # 缓存10分钟
生产环境中,建议保留缓存以提升性能,同时根据API更新频率调整ttl值。
Linux服务器基础优化
Swagger UI的静态资源(JS、CSS、HTML)缓存可减少浏览器重复请求,提升页面加载速度。
配置HTTP缓存头(Nginx示例)
通过Nginx服务器设置静态资源的Cache-Control和Expires头,实现长期缓存。例如:
server {
listen 80;
server_name your-domain.com;
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y; # 缓存1年
add_header Cache-Control "public, immutable"; # 不可变缓存(浏览器无需验证)
add_header ETag ""; # 禁用ETag验证
if_modified_since off; # 禁用Last-Modified验证
}
location ~* \.(html)$ {
expires 1h; # HTML缓存1小时(需及时更新)
add_header Cache-Control "public, must-revalidate"; # 需验证缓存
}
location /swagger-ui/ {
proxy_pass http://localhost:8080/swagger-ui/; # 反向代理到Swagger UI
}
}
immutable参数表示资源内容不会改变,浏览器可直接使用缓存,无需向服务器发送请求。
利用浏览器本地存储(LocalStorage)
通过JavaScript将Swagger规范文档存储在浏览器的LocalStorage中,下次访问时优先读取本地缓存。例如:
const cachedSpecKey = 'swagger_spec_cache';
const cachedTimestampKey = 'swagger_spec_timestamp';
// 获取缓存的文档
function getCachedSpec() {
const cached = localStorage.getItem(cachedSpecKey);
const timestamp = localStorage.getItem(cachedTimestampKey);
if (cached && timestamp && Date.now() - timestamp < 300000) { // 5分钟内有效
return JSON.parse(cached);
}
return null;
}
// 缓存文档
function cacheSpec(spec) {
localStorage.setItem(cachedSpecKey, JSON.stringify(spec));
localStorage.setItem(cachedTimestampKey, Date.now().toString());
}
// Swagger UI请求拦截器(添加缓存逻辑)
const requestInterceptor = (req) => {
if (req.url.includes('/v3/api-docs')) {
const cachedSpec = getCachedSpec();
if (cachedSpec) {
req.headers['X-Cached-Spec'] = 'true'; // 标记为缓存请求
return Promise.resolve({ ok: true, json: () => Promise.resolve(cachedSpec) });
}
}
return req;
};
// 初始化Swagger UI
SwaggerUI({
requestInterceptor: requestInterceptor,
url: '/v3/api-docs', // Swagger文档接口
dom_id: '#swagger-ui'
});
此方案适用于网络不稳定或API文档更新不频繁的场景,可显著减少等待时间。
若Swagger API涉及数据库查询(如动态生成文档或返回业务数据),可通过Redis/Memcached缓存高频访问数据,减少数据库压力。
引入缓存中间件
在Linux服务器上安装Redis(高性能内存数据库),并通过Spring Boot的spring-boot-starter-data-redis模块集成:
<!-- pom.xml 添加依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置Redis连接信息(application.yml):
spring:
redis:
host: localhost
port: 6379
password: your-password
缓存高频数据
使用@Cacheable注解缓存API返回的业务数据,例如:
@RestController
@RequestMapping("/api/products")
public class ProductController {
@Autowired
private ProductService productService;
@GetMapping("/{id}")
@Cacheable(value = "products", key = "#id") // 缓存key为产品ID
public Product getProduct(@PathVariable Long id) {
return productService.getProductById(id); // 数据库查询
}
}
上述配置会将getProduct方法的返回结果缓存到Redis中,下次相同请求时直接从缓存读取,减少数据库查询次数。
cache.disabled: true),确保文档及时更新;生产环境需开启缓存并设置合理有效期(如ttl: 600000),平衡性能与实时性。@CacheEvict注解清除指定缓存),避免脏数据。通过以上策略,可在Linux环境下充分利用Swagger的缓存功能,提升API文档加载速度与后端响应效率,优化整体性能。