JSP在Ubuntu上的缓存优化实践
一 前端与协议层缓存
<%
response.setHeader("Cache-Control", "public, max-age=31536000");
response.setDateHeader("Expires", System.currentTimeMillis() + 31536000L*1000);
%>
public class CacheFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse r = (HttpServletResponse) res;
String uri = ((HttpServletRequest)req).getRequestURI();
if (uri.endsWith(".js") || uri.endsWith(".css") || uri.contains("/static/")) {
r.setHeader("Cache-Control", "public, max-age=31536000");
r.setDateHeader("Expires", System.currentTimeMillis() + 31536000L*1000);
} else {
r.setHeader("Cache-Control", "no-cache, must-revalidate");
}
chain.doFilter(req, res);
}
public void init(FilterConfig c) {}
public void destroy() {}
}
在web.xml中映射:*.jsp, /static/*等路径。该做法便于与CDN协同,降低源站压力。二 页面与片段缓存
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:cache var="sidebar" scope="page" time="3600" unit="second">
<!-- 计算或查询较耗时的片段 -->
<div>热点内容或导航</div>
</c:cache>
<c:out value="${sidebar}" escapeXml="false"/>
提示:c:cache属于JSTL,需引入JSTL库;对高度个性化内容避免使用片段缓存。三 数据层与应用层缓存
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.9.6</version>
</dependency>
CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder().build(true);
Cache<String,String> cache = cacheManager.createCache("viewCache",
CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, String.class,
ResourcePoolsBuilder.heap(1000)).build());
String key = "hotData";
String data = cache.get(key);
if (data == null) {
data = loadDataFromService(); // 代价高的获取逻辑
cache.put(key, data);
}
// 使用 data 渲染页面
四 操作系统与反向代理层优化
vm.vfs_cache_pressure = 50
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
# 执行:sudo sysctl -p 使配置生效
gzip on;
gzip_types text/html text/css application/javascript application/json;
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=STATIC:10m inactive=60m;
server {
location /static/ {
proxy_cache STATIC;
proxy_pass http://127.0.0.1:8080;
}
}
五 落地配置与验证
| 层级 | 目标 | 建议策略 | 示例值 |
|---|---|---|---|
| 浏览器/CDN | 减少回源 | 强缓存长期静态资源 | Cache-Control: public, max-age=31536000 |
| Nginx | 边缘缓存与压缩 | 静态资源与可缓存接口 | Gzip;proxy_cache |
| Tomcat/JSP | 降低编译与渲染开销 | 启用JSP预编译;减少Java脚本片段 | jspc/mvn插件;MVC分层 |
| 应用数据 | 减少重复计算与DB压力 | Ehcache/Guava本地缓存 | TTL=60–300s;最大条目按内存评估 |
| 操作系统 | 提升文件访问吞吐 | 合理利用Page Cache | vm.vfs_cache_pressure=50 等 |