这篇文章主要介绍了使用filter实现url级别内存缓存示例,只需要一个静态类,在filter中调用,也可以全部写到filt里面。可以根据查询参数分别缓存,需要的朋友可以参考下
用到了fastJson用来解析配置,原理是通过自己实现response类来得到输出的内容
package saleandbuy.freemodule.web.filter;import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.FilterChain;
import javax.servlet.servletexception;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class CacheResp {
private long waitTime=1000*3;
private static Map cfgMap=new HashMap();
public static final String QUERY_STRINGS="queryStrings";
public static final String CACHED_TIME="cachedTime";
public static final String CACHE_CONfig="cacheConfig";
public static void config(String cfgJson) {
JSONObject cfg=JSON.parSEObject(cfgJson);
for (Map.Entry entry : cfg.entrySet()) {
String key=entry.getKey();
Map value=(Map) entry.getValue();
List queryStrings= (JSONArray)value.get(QUERY_STRINGS);
Integer cachedTime=(Integer) value.get(CACHED_TIME);
CacheInfo cacheInfo=new CacheInfo(queryStrings,cachedTime);
cfgMap.put(key, cacheInfo);
}
}
public static void cachedDo(HttpServletRequest request, HttpServletResponse response,FilterChain chain) throws IOException, servletexception {
CacheInfo cacheInfo=getCacheInfo(request);
String queryString=request.getQueryString();
//cacheInfo为空则不需要缓存,不为空则需要缓存
if(cacheInfo!=null){
long Now=System.currentTimeMillis();
synchronized (CacheResp.class) {
if(Now-cacheInfo.lastUpdateTime>cacheInfo.cachedTime){
System.out.println("not use cache:");
ProxyResponse proxyResponse=new ProxyResponse(response);
chain.doFilter(request, proxyResponse);
cacheInfo.cacheMap.put(queryString, proxyResponse.getBuffer());
cacheInfo.lastUpdateTime=Now;
}else {
System.out.println("use cache");
}
}
String cacheStr=cacheInfo.cacheMap.get(queryString).toString();
response.getWriter().write(cacheStr);
}else {
chain.doFilter(request, response);
}
}
private static CacheInfo getCacheInfo(HttpServletRequest request){
String key=request.getRequestURI().replace(request.getcontextpath(), "");
CacheInfo cacheInfo=cfgMap.get(key);
if(cacheInfo!=null&&
cacheInfo.needCache(request.getQueryString())){
return cacheInfo;
}
return null;
}
public static class CacheInfo{
public List queryStrings=Arrays.asList(new String[]{"list","index"});
public long cachedTime=1000;
public long lastUpdateTime=0;
public Map cacheMap=new HashMap();
public CacheInfo(List queryStrings, Integer cachedTime) {
if(cachedTime!=null){
this.cachedTime = cachedTime;
}
this.queryStrings = queryStrings;
}
/**
*
* @param queryStrings request.getQueryString
* @return
*/
public boolean needCache(String queryStrings) {
if(queryStrings==null){//queryStrings为空时默认缓存所有的查询
return true;
}
return queryStrings.contains(queryStrings);
}
}
private static class ProxyResponse extends HttpServletResponseWrapper{
private StringWriter sw=new StringWriter();
// private ByteArrayOutputStream baos=new ByteArrayOutputStream();
public ProxyResponse(HttpServletResponse response) {
super(response);
}
@Override
public PrintWriter getWriter() throws IOException {
return new PrintWriter(sw);
}
public StringBuffer getBuffer() {
return sw.getBuffer();
}
}
}
上一篇:Java关键字volatile知识点总结下一篇:Eclipse2020安装了最新版本的JDK却无法打开的问题 热门搜索:
ASP+缓存实现
类级别缓存
内存缓存
内存使用
相关文章
使用filter实现url级别内存缓存示例
2021-10-08阅读(6654)评论(0)推荐()这篇文章主要介绍了使用filter实现url级别内存缓存示例,只需要一个静态类,在filter中调用,也可以全部写到filt里面。可以根据查询参数分别缓存,需要...
Spring实战之类级别缓存实现与使用方法
2021-10-19阅读(3553)评论(0)推荐()这篇文章主要介绍了Spring实战之类级别缓存实现与使用方法,结合实例形式分析了Spring类级别缓存配置、属性、领域模型等相关操作技巧,需要的朋友可以参考下
Spring实战之方法级别缓存用法示例
2021-09-19阅读(6241)评论(0)推荐()这篇文章主要介绍了Spring实战之方法级别缓存用法,结合实例形式分析了spring方法级别缓存配置、属性文件、领域模型及相关使用技巧,需要的朋友可以参考下
PHP内存缓存实现方法
2021-11-06阅读(3762)评论(0)推荐()这篇文章主要介绍了PHP内存缓存实现方法,分析了Memcached缓存的用法并比较了APC、EC、Zend加速器的用法,需要的朋友可以参考下
Mybatis 一级缓存与二级缓存的实现
2021-10-12阅读(8442)评论(0)推荐()mybatis作为一个流行的持久化工具,缓存必然是缺少不了的组件。通过这篇文章,就让我们来了解一下一级缓存与二级缓存的实现,具有一定的参考价值,感兴趣的小伙伴们...
PHP中文件缓存转内存缓存的方法
2021-11-06阅读(8847)评论(0)推荐()顾名思义文件缓存转内存缓存就是将存储在文件中的数据转到内存中去,实现磁盘操作转为内存操作,这样可以大大提高数据访问速度,并能实现缓存数据的分布式部署。文件缓存与...
Android图片三级缓存策略(网络、本地、内存缓存)
2021-10-05阅读(8355)评论(0)推荐()这篇文章主要介绍了Android图片三级缓存策略(网络、本地、内存缓存)的相关资料,需要的朋友可以参考下
取消
提交评论