Ehcache对质页面、对象、数据缓存,同时支持集群/分布式缓存。整合Spring、Hibernate也非常的简单,spring对Ehcache的支持也非常好。EHCache支持内存和磁盘的缓存,支持LRU、LFU和FIFO多种淘汰算法,支持分布式的Cache,可以作为Hibernate的缓存插件。同时它也能提供基于Filter的Cache,该Filter可以缓存响应的内容并采用Gzip压缩提高响应速度。
下面配置EhCache的页面缓存
一、依赖jar包
ehcache-core-2.5.2.jar
ehcache-web-2.0.4.jar
其它spring等相关jar包
二、加入ehcache.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
<diskStore path="java.io.tmpdir"/>
<defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="30" timeToLiveSeconds="30" overflowToDisk="false"/>
<!--
配置自定义缓存
maxElementsInMemory:缓存中允许创建的最大对象数
eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
timeToIdleSeconds:
缓存数据的钝化时间,也就是在一个元素消亡之前, 两次访问时间的最大时间间隔值,
这只能在元素不是永久驻留时有效, 如果该值是 0 就意味着元素可以停顿无穷长的时间。
timeToLiveSeconds:
缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,
这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。
overflowToDisk:内存不足时,是否启用磁盘缓存。
memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。
-->
<cache name="SimplePageCachingFilter"
maxElementsInMemory="10000"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="3"
timeToLiveSeconds="6"
memoryStoreEvictionPolicy="LFU" />
</ehcache>
三、重新实现SimplePageCachingFilter类,SimplePageCachingFilter类也可以不重现实现,也能达到缓存效果,这里根据实现需求,进行重新实现
package com.cache;
import java.util.Enumeration;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.ehcache.CacheException;
import net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter;
import org.apache.cxf.common.util.StringUtils;
/**
* EhCache 页面缓存过滤器
*
*/
public class PageCachingFilter extends SimplePageCachingFilter {
private final static String FILTER_URL_PATTERNS = "patterns";
private static String[] cacheURLs;
private void init() throws CacheException {
String patterns = filterConfig.getInitParameter(FILTER_URL_PATTERNS);
cacheURLs = StringUtils.split(patterns, ",");
}
@Override
protected void doFilter(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) {
try {
if (cacheURLs == null) {
init();
}
String url = request.getRequestURI();
boolean flag = false;
if (cacheURLs != null && cacheURLs.length > 0) {
for (String cacheURL : cacheURLs) {
if (url.contains(cacheURL.trim())) {
flag = true;
break;
}
}
}
if (flag) {// 包含我们指定要缓存的url 就缓存该页面,否则执行正常的页面转向
String query = request.getQueryString();
if (query != null) {
query = "?" + query;
url = url + query;
}
System.out.println("当前请求被缓存:" + url);
super.doFilter(request, response, chain);
} else {
chain.doFilter(request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("rawtypes")
private boolean headerContains(final HttpServletRequest request, final String header, final String value) {
logRequestHeaders(request);
final Enumeration accepted = request.getHeaders(header);
while (accepted.hasMoreElements()) {
final String headerValue = (String) accepted.nextElement();
if (headerValue.indexOf(value) != -1) {
return true;
}
}
return false;
}
/** 兼容ie6/7 gzip压缩*/
@Override
protected boolean acceptsGzipEncoding(HttpServletRequest request) {
boolean ie6 = headerContains(request, "User-Agent", "MSIE 6.0");
boolean ie7 = headerContains(request, "User-Agent", "MSIE 7.0");
return acceptsEncoding(request, "gzip") || ie6 || ie7;
}
}
四、在web.xml加入配置
<!-- EhCache页面缓存 -->
<filter>
<filter-name>PageCachingFilter</filter-name>
<filter-class>com.cache.PageCachingFilter</filter-class>
<init-param>
<param-name>patterns</param-name>
<!-- 配置你需要缓存的url -->
<param-value>/pageCache.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>PageCachingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
五、编辑测试页面pageCache.jsp
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试EhCache页面缓存</title>
</head>
<body>
测试EhCache页面缓存
<%
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
out.print(format.format(new Date()));
System.out.println(System.currentTimeMillis());
%>
</body>
</html>