什么时候需要缓存?
1.被处理内容短时间不变
2. 在一个不太长的时间内,被处理的内容可能或者必定产生变化,所以必须将他们作为动态内容进行处理
解决方法:
当上述的基础数据或者统计报表第一次被访问时,被处理的内容被当作动态信息,基础数库从数据库中获得,统计报表也会被生成符合要求的图形、文件,然后这些信息都会被放入缓存信息中。
当上述的基础数据或者统计报表继续被访问时,系统将会首先检查缓存信息中是否有对应的内容和我们设定的缓存规则,如果符合缓存信息存在而且符合缓存规则,给出的响应将来自于缓存信息,如果没有或者缓存信息已经不符合设定的要求,系统将重复上一步的动作。
property文件中写中文的配置
在Eclipse中Server下Tomcat下配置Paths 右边的窗口中Prepend to classpath 加入 jdk下lib下的tools.jarAppend to classpath 启动classpath加入jre下lib的rt.jar和charset.jar,
持久化缓存内容就是将缓存的内容保存到磁盘中,示例如下:
cache.memory=false cache.capacity=1000 cache.path=c:\\oscache
cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
<oscache:cache>
<%=new Date()%>
</oscache:cache>
使用默认的关键字来标识cache内容, 将以URI和查询字符串组成,如果访问/oscache/index.jsp?name=ttt和/oscache/index.jsp?name=ppp将得到两分缓存,缓存默认放到application范围,缓存时间默认为一个小时
<oscache:cache key = "name" time = "10" refresh=${param.refresh} scope="session" >
name=${param.name}
</oscache:cache>
这时候缓存将以name为key,不再是请求URI+查询字符串组成,所以如果你访问/oscache/index.jsp?name=ttt和/oscache/index.jsp?name = ppp将得到一份缓存,上面设置了缓存的时间为10s,超过10s后,缓存内容讲失掉,scope="session"缓存范围设置为session,这时候缓存保存在用户的session中,Refresh为true将会导致缓存的内容过期而被清除,Refresh="true"用户清除缓存,如果用户把浏览器关闭,在重新打开一个新的浏览器,原来缓存的内容将不存在
<oscache:flush scope="appliaction"> 清除application所有的缓存
<oscache:flush scope="session" key = "foobar">清除session范围内的key为foobar的缓存
<oscache:flush scope="application" group="currencyDate">清除application范围内名为currencyDate内的所有缓存
页面的全局缓存
web.xml 配置过滤器并设置所有的jsp都进行缓存
<filer-mapping>中<url-pattern>*.jsp</url-pattern>都执行过滤器
<file-name>CacheFiler</file-name>
动态设定key值,使用自己指定的time属性设定缓存内容的超时时间,使用动态refresh值决定是否强制内容刷新。 因为OSCache使用key值来标识缓存内容,使用相同的key值将会被认为使用相同的的缓存内容,所以使用动态的key值可以自由的根据不同的角色、不同的要求决定使用不同的缓存内容。
key="<s:property value = "hcinfo.id"/>"
refresh="<s:property value = "needreflush"/>"
设置time属性为负数使缓存内容永不过期
使用duration属性设置超期时间 duration=''5s''
使用mode属性使被缓存的内容不加入给客户的响应中 mode=''silent''
<filter-name>CacheFilter</filter-name>
缓存单个文件 web.xml
<url-pattern>/testContent.jsp</url-pattern>
对所有jsp页面内容进行缓存
<url-pattern>*.jsp</url-pattern>
自己设定缓存属性
页面缓存的情况下配置的web.xml 的init-param中配置作用域
<param-name>scope</param-name><param-value>session</param-value>
配置过期时间
<param-name>time</param-name><param-value>600</param-value>
如果refresh属性设置为true,不管其他的属性是否符合条件,这部分被缓存的内容都将被更新,这给编程者一种选择,决定什么时候必须刷新。
其他属性cron 、groups、language、refreshpolicyclass、refreshpolicyparam
将oscache.properties、oscache.tld放入WEB-INF\class目录
<taglib>
<taglib-uri>oscache</taglib-uri>
<taglib-location>/WEB-INF/classes/ oscache.tld</taglib-location>
</taglib>
Jsp:<%@ taglib uri = "/WEB-INF/classes/oscache.tld" prefix = "cache" %>
页面缓存中还需要做的一个步骤就是通知缓存需要更新
在实现页面缓存时最麻烦的主要是缓存的 key的定义以及缓存更新的通知,缓存 key 的定义这个自然框架是没法解决的,不过缓存更新的通知其实在框架中可以考虑一种通知模型的, 就像事件通知那样 ........ 在实际的项目中,可以自己去实现一个这样的通知模型或者就是简单的采用单例方式来标识某个 key 是否需要更新。
下面是OSCache的学习文档和项目示例
使用Oscache的时候 java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
解决办法 该错是找不到日志类,加入 加入common-loggin.jar就可以了