java基于filter的应用缓存框架
java web 基于filter的缓存框架
目标、解决的问题:
浏览器客户端向服务器发起许多参数相同的请求,在服务器端的处理之后,在相同参数的情况下,返回的结果一致的情况下,使用该缓存框架,可以提高web服务器的性能。
在java的web开发的时候,有许多请求,在后台处理之后,可能返回相同的数据到浏览器端,或者在一定时间内,返回的结果可能都是一样的。因此可以将执行后的返回结果缓存起来,再下一次相同请求,相同参数的情况向可以直接从缓存中获取到处理结果。例如在一个用户管理系统中,普通的操作有添加、修改、删除、查询4个操作,在执行查询操作的时候,实际上,只要数据库中数据没有发生变化,则返回到浏览器端的数据都是一样的,因此可以给用户的查询增加缓存。
第一步:如下代码:
public String query() {String result = ERROR;try{List<User> allUser = userService.query();ServletActionContext.getRequest().setAttribute("allUser", allUser);}catch (Exception e) {e.printStackTrace();}return result;}
public String query() {String result = ERROR;try{String username = ServletActionContext.getRequest().getParameter("username");List<User> allUser = userService.query(username);ServletActionContext.getRequest().setAttribute("allUser", allUser);}catch (Exception e) {e.printStackTrace();}return result;}
public String query() {String result = ERROR;try{String username = ServletActionContext.getRequest().getSession().getAttribute("username").toString();List<User> allUser = userService.query(username);ServletActionContext.getRequest().setAttribute("allUser", allUser);}catch (Exception e) {e.printStackTrace();}return result;}
<!-- 缓存过滤器 --><filter><filter-name>cacheFilter</filter-name><filter-class>com.cjnetwork.cache.filter.CacheFilter</filter-class><init-param><param-name>configFileLocation</param-name><!-- 缓存策略配置文件地址,默认为cache.xml --><param-value></param-value></init-param><init-param><param-name>requestUriIncludePattern</param-name><!-- 缓存过滤器,需要处理的请求的地址的正则表达式 --><param-value>.*?!.*?</param-value></init-param><init-param><param-name>requestUriExcludePattern</param-name><!-- 缓存过滤器,需要排除的请求的地址的正则表达式 --><param-value></param-value></init-param><init-param><param-name>xmlReloadable</param-name><!-- 策略文件是否为重新导入模式,即当配置文件变化的时候,不需要重新启动应用程序,缓存框架会自动检测到,该功能在开发调制阶段非常有用(推荐在生产环境设置为false) --><param-value>true</param-value> </init-param><init-param><param-name>cacheProvider</param-name><!-- 缓存提供者,可以自定义缓存数据存放方式(内存、其他KeyValue缓存框架等) --><param-value>com.cjnetwork.cache.provider.SimpleMemeryCacheProvider</param-value></init-param></filter>
<filter-mapping><filter-name>cacheFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
<annotationPackage><!-- 注解所在的包 --><package uriPrefix="" uriSeperator="!" uriSuffix=".action">com.cjnetwork.gis.action</package></annotationPackage>
<defaultCache cacheable="true" cacheTime="180"><!-- cacheable:默认是否缓存true/false cacheTime:默认缓存时间(秒)--><keyFromRequestIncludePattern></keyFromRequestIncludePattern><!-- 可存在多个,request的请求参数中,需要包含在缓存主键生成中,不配置表示请求中所有参数都要包含 --><keyFromRequestExcludePattern></keyFromRequestExcludePattern><!-- 可存在多个,request的请求参数中,需要从缓存主键生成中排除,不配置表示请求中所有参数都不排除(包含) --><keyValuePairFromRequestExclude>page=1</keyValuePairFromRequestExclude><!-- 可存在多个,request的请求参数中,需要从缓存主键生成中排除的特殊键值对,例如在请求某个查询的时候,有page=1的参数和不带该参数的查询,其结果应该是一样的,不配置表示请求中所有参数都要包含 --><keyValuePairFromRequestExclude>pageSize=10</keyValuePairFromRequestExclude><!-- 可存在多个,request的请求参数中,需要从缓存主键生成中排除的特殊键值对,例如在请求某个查询的时候,有page=1的参数和不带该参数的查询,其结果应该是一样的,不配置表示请求中所有参数都要包含 --><keyFromSessionIncludePattern></keyFromSessionIncludePattern><!-- 可存在多个,session的参数中,需要包含在缓存主键生成中,不配置表示请求中所有参数都要包含 --><keyFromSessionExcludePattern></keyFromSessionExcludePattern><!-- 可存在多个,session的参数中,需要从缓存主键生成中排除,不配置表示请求中所有参数都不排除(包含) --><keyValuePairFromSessionExclude></keyValuePairFromSessionExclude><!-- 可存在多个,request的请求参数中,需要从缓存主键生成中排除的特殊键值对,例如在请求某个查询的时候,有page=1的参数和不带该参数的查询,其结果应该是一样的,不配置表示请求中所有参数都要包含 --></defaultCache>
<cache uri="testAction!test.action" cacheable="true" cacheTime="180"><!-- cacheable:是否缓存true/false cacheTime:缓存时间(秒)--><keyFromRequestIncludePattern></keyFromRequestIncludePattern><!-- 可存在多个,request的请求参数中,需要包含在缓存主键生成中,不配置表示请求中所有参数都要包含 --><keyFromRequestExcludePattern></keyFromRequestExcludePattern><!-- 可存在多个,request的请求参数中,需要从缓存主键生成中排除,不配置表示请求中所有参数都不排除(不包含) --><keyValuePairFromRequestExclude>page=1</keyValuePairFromRequestExclude><!-- 可存在多个,request的请求参数中,需要从缓存主键生成中排除的特殊键值对,例如在请求某个查询的时候,有page=1的参数和不带该参数的查询,其结果应该是一样的,不配置表示请求中所有参数都要包含 --><keyValuePairFromRequestExclude>pageSize=10</keyValuePairFromRequestExclude><!-- 可存在多个,request的请求参数中,需要从缓存主键生成中排除的特殊键值对,例如在请求某个查询的时候,有page=1的参数和不带该参数的查询,其结果应该是一样的,不配置表示请求中所有参数都要包含 --><keyFromSessionIncludePattern></keyFromSessionIncludePattern><!-- 可存在多个,session的参数中,需要包含在缓存主键生成中,不配置表示请求中所有参数都要包含 --><keyFromSessionExcludePattern></keyFromSessionExcludePattern><!-- 可存在多个,session的参数中,需要从缓存主键生成中排除,不配置表示请求中所有参数都不排除(不包含) --><keyValuePairFromSessionExclude></keyValuePairFromSessionExclude><!-- 可存在多个,session的请求参数中,需要从缓存主键生成中排除的特殊键值对,例如在请求某个查询的时候,有page=1的参数和不带该参数的查询,其结果应该是一样的,不配置表示请求中所有参数都要包含 --><effects><effect uri="testAction!test1.action" /><!-- 可存在多个,缓存击穿地址,表示当目前uri地址testAction!test.action如果真正执行,将击穿uri="testAction!test1.action在系统中的缓存 --><effectBy uri="testAction!test2.action" /><!-- 可存在多个,缓存击穿地址,表示当testAction!tes2t.action如果真正执行,将击穿目前uri地址testAction!test.action在系统中的缓存 --><effects></cache>