01404421 发表于 2013-2-6 09:33:25

Oscache CacheFilter缓存url和控制刷新的简单实现

使用SSH做成的网站,首页如何载入数据是一个问题,既要考虑到及时性和性能也要考虑到SEO,javaeye上也有很多相关的讨论。比如问答版块中的:
如何处理网站首页中的各个子栏目或频道?


http://www.iteye.com/problems/27503
SSH框架的网站首页是怎样初始化的??

http://www.iteye.com/problems/27503
看了一上午,小总结了一下,无非是以下几种方法:
1.使用首页静态化
2.使用ajax动态调用数据库内容
3.部分静态和部分动态调用
4.使用缓存。
根据我们的需求,我使用缓存首页,具体使用Oscache的CacheFilter缓存首页,具体配置记录如下:
1.引入Oscache的jar
2.src下放入Oscache的配置文件oscache.properties
3.web.xml中写入配置:
    最简单的配置:

<filter>    <filter-name>CacheFilter</filter-name>    <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class></filter><filter-mapping>    <filter-name>CacheFilter</filter-name>    <url-pattern>/index.jsp</url-pattern></filter-mapping>
 关于详细配置的介绍在这里:http://www.opensymphony.com/oscache/wiki/CacheFilter.html
 一下是我的配置:

<filter><filter-name>CacheFilter</filter-name><filter-class>com.cache.MyFilterCache</filter-class><init-param><param-name>time</param-name><param-value>-1</param-value></init-param><init-param><param-name>EntryRefreshPolicy</param-name><param-value>com.cache.MyEntryRefreshPolicy</param-value></init-param></filter><filter-mapping><filter-name>CacheFilter</filter-name><url-pattern>/index.jsp</url-pattern></filter-mapping> 注意:1.filter-class可以使用Oscache自带的com.opensymphony.oscache.web.filter.CacheFilter,
         我是为了方便所以自己写了一个类继承了它,重写了一个createCacheKey方法:
     public class MyFilterCache extends CacheFilter{
@Override public String createCacheKey(HttpServletRequest httpRequest, ServletCacheAdministrator scAdmin, Cache cache) {return httpRequest.getServletPath();    }}              2. EntryRefreshPolicy是一个刷新缓存的控制类,实现EntryRefreshPolicy接口,这个接口只声明了
    一个方法needsRefresh,就是是否要刷新,呵呵。网上有人说使用CacheFilter无法自己控制刷新,
只能用时间来控制,我看了一下源码发现是可以实现的。

public class MyEntryRefreshPolicy implements EntryRefreshPolicy {@Overridepublic boolean needsRefresh(CacheEntry entry) {if(CacheUtil.isFLUSH()){//判断是否需要刷新缓存CacheUtil.setFLUSH(false);//刷新缓存后把需要刷新状态设为falsereturn true;}return false;}} 其中用到了一个工具类:

public class CacheUtil {private static boolean FLUSH=false;//是否刷新缓存public static boolean isFLUSH() {return FLUSH;}public static void setFLUSH(boolean flush) {FLUSH = flush;}}3.配置中的time是控制刷新时间的,是int类型单位是s,默认是3600.我写成-1是不让他的这个功能生效。 
然后就可以手动的控制是否需要刷新了。
如果不仅需要定时刷新还需要手动刷新的话,就在needsRefresh方法中再总相应的处理。
在我的下一笔文章中实现了定时刷新和手动刷新:Oscache CacheFilter定时刷新和手动刷新缓存URL的实现http://01404421.iteye.com/blog/510712
页: [1]
查看完整版本: Oscache CacheFilter缓存url和控制刷新的简单实现