微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用filter实现url级别内存缓存示例

这篇文章主要介绍了使用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) {

   super();

   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图片三级缓存策略(网络、本地、内存缓存)的相关资料,需要的朋友可以参考下

取消

有人回复邮件通知

提交评论

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐