在写完上一篇关于Oscache CacheFilter手动刷新的文章(
http://01404421.iteye.com/blog/510649)后,又感觉有些不太完美,虽然实现了可以控制的刷新但是又不能定时刷新,随后又看了一下源码,主要是com.opensymphony.oscache.web.filter.CacheFilter和com.opensymphony.oscache.web.filter.ExpiresRefreshPolicy,经过一个多小时终于实现了可以定时刷新和手动刷新的功能。废话不多说了,先贴代码:
web.xml
<filter>
<filter-name>CacheFilter</filter-name>
<filter-class>
com.cache.MyFilterCache
</filter-class>
<init-param>
<param-name>time</param-name>
<param-value>8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
定时8s自动刷新缓存。
com.cache.MyFilterCache
public class MyFilterCache extends CacheFilter{
private final Log log = LogFactory.getLog(this.getClass());
@Override
public void init(FilterConfig filterConfig) {
// TODO Auto-generated method stub
super.init(filterConfig);
this.setExpiresRefreshPolicy(new MyEntryRefreshPolicy(this.getTime()));//初始化刷新策略
}
@Override
public String createCacheKey(HttpServletRequest httpRequest, ServletCacheAdministrator scAdmin, Cache cache) {
return httpRequest.getServletPath();//使用访问路径来作为缓存的key,也可以不设置
}
}
createCacheKey这个方法大家可以不用重写也行,不影响。
要注意init方法中两句代码的次序,必须先调用super.init,因为在super中是用了一个Oscache自带的com.opensymphony.oscache.web.filter.ExpiresRefreshPolicy来作为刷新策略,所以我们的要放在后面来set进去覆盖默认的。默认的刷新只是根据时间来做判断。
一下是我们自己的刷新策略:
com.cache.MyEntryRefreshPolicy
public class MyEntryRefreshPolicy extends ExpiresRefreshPolicy{
public MyEntryRefreshPolicy(int refreshPeriod) {
// TODO Auto-generated constructor stub
super(refreshPeriod);
}
@Override
public boolean needsRefresh(CacheEntry entry) {
// TODO Auto-generated method stub
if(CacheUtil.isFLUSH()){
CacheUtil.setFLUSH(false);
return true;
}
return super.needsRefresh(entry);
}
}
注意needsRefresh方法,最重要的就在这里(其实也很简单,呵呵),判断是否需要刷新,如果需要则返回true去刷新,如果不需要则再去判断时间,当然这里并不是很科学,毕竟手动刷新的几率较小,而每次都要去判断,最好应该放在按照时间判断的后面。以下是一个用来记录是否需要刷新的类:
public class CacheUtil {
private static boolean FLUSH=false;//是否需要刷新缓存
public static boolean isFLUSH() {
return FLUSH;
}
public static void setFLUSH(boolean flush) {
FLUSH = flush;
}
}
手动刷新时,只需要给这个CacheUtil.setFLUSH(true)就行了。
到这里就行了,不过在我学习Oscache源码的过程当中发现有个小问题很有趣,下面是
com.opensymphony.oscache.web.filter.ExpiresRefreshPolicy的源码:
public class ExpiresRefreshPolicy implements EntryRefreshPolicy {
private long refreshPeriod;
public ExpiresRefreshPolicy(int refreshPeriod) {
this.refreshPeriod = refreshPeriod * 1000L;
}
public boolean needsRefresh(CacheEntry entry) {
long currentTimeMillis = System.currentTimeMillis();
if ((refreshPeriod >= 0) && (currentTimeMillis >= (entry.getLastUpdate() + refreshPeriod))) {
return true;
} else if (entry.getContent() instanceof ResponseContent) {
ResponseContent responseContent = (ResponseContent) entry.getContent();
return currentTimeMillis >= responseContent.getExpires();
} else {
return false;
}
}
public long getRefreshPeriod() {
return refreshPeriod / 1000;
}
public void setRefreshPeriod(long refreshPeriod) {
this.refreshPeriod = refreshPeriod * 1000L;
}
}
代码很简单吧,我去掉了所有的注释,我们都知道web.xml中设置的time参数单位是秒,但是实际上这里处理的时候是按照毫秒来处理的,从构造方法和set方法里将时间间隔乘1000,扩大为秒,其实最终用途只是用来比较时间戳的大小,个人感觉如果在并发量很大的情况下使用Oscache,这个乘1000的操作可能也会带来很大的性能损耗,其实完全可以在web.xml中按照毫秒来写,这里拿到后直接处理。
扩展一下:
以上例子只是用于一个URL,如果有多个url需要缓存同样可以设置单独刷新。不CacheUtil里可能就是一个MAP了。不过好像根据cache的key也可以刷新指定的cache,key的生产也是可以自己控制的,所以这个方案应该同样可以实现。不过刚开始我在测试group和key的刷新时没有成功,呵呵,以后再看看吧。
欢迎与各位交流。
分享到:
- 2009-11-05 16:17
- 浏览 3945
- 评论(0)
- 论坛回复 / 浏览 (0 / 4288)
- 查看更多
相关推荐
描述中提到的“源代码”和“博文链接”暗示我们将通过阅读源码和博客文章来理解如何配置OSCache Filter以实现URL级别的缓存,并且这种配置变动在不重启服务器的情况下即可生效。 **OSCache基础** 1. **OSCache简介...
此外,OSCache还提供了缓存分组和缓存区域的概念,便于管理多个不同类型的缓存。通过设置不同的缓存区域,可以实现不同业务场景下的缓存策略。 在实际应用中,可能还需要考虑缓存同步问题。例如,当有多个服务器...
OsCache提供了一系列清理方法,如`remove()`用于手动移除特定缓存项,`evictExpiredObjects()`用于清除所有已过期的缓存项。 在压缩包中的文件,如`servlet+天气预报+缓存技术`,可能包含了一个完整的示例项目,...
- **事件监听**:osCache允许注册监听器来处理缓存的添加、删除和更新事件,这在实现缓存同步或记录日志时非常有用。 - **缓存预热**:在应用启动时,可以预先加载一部分常用数据到缓存,提高系统启动后的响应速度...
oscache是一种缓存机制,主要用于提高Web应用的响应速度和优化系统性能。以下是对这些知识点的详细解析: ### oscache简介 oscache是一款开源的Java缓存解决方案,其核心功能在于能够缓存Web应用中的动态内容,...
本实例将介绍如何结合Hibernate和OSCache实现二级缓存,以优化应用程序的性能。 一级缓存是Hibernate内置的Session级别的缓存,它存储了在同一个Session内操作的对象,避免了频繁的数据库读写。然而,一级缓存仅...
osCache是Java开发中常用的缓存框架之一,它主要用于提高应用程序的性能和效率,通过将数据存储在内存中,减少对数据库的访问。osCache不仅可以用于Web应用,也可以用于任何Java应用程序,支持集群环境,提供了丰富...
3. 更新通知:当缓存中的数据发生变化时,osCache可以通过事件机制通知其他系统组件,实现数据的一致性。 4. 缓存同步:在多线程或多服务器环境下,osCache提供了一套机制来确保缓存数据的一致性和完整性。 三、...
在web.xml中配置CacheFilter,指定要缓存的URL模式和缓存配置。 5.2.2 CacheFilter参数说明 CacheFilter的配置涉及多个参数,例如`cacheName`用于指定缓存区域,`cacheKey`定义了缓存键的生成规则,`...
- **缓存刷新**:支持手动和自动的缓存刷新机制,确保数据的实时性。 - **并发控制**:内置锁机制,确保多线程环境下数据的一致性。 - **缓存监听器**:允许注册监听器,当缓存发生变动时触发相应事件。 - **与...
3. **缓存刷新与过期**:OSCache 提供了自动和手动两种方式来控制缓存的过期和刷新。自动过期可以通过设置时间戳或者访问次数来触发,而手动刷新则允许开发者根据业务需求来更新缓存内容。 4. **缓存同步**:在多...
OSCache 提供了一个名为 `CacheFilter` 的过滤器,该过滤器用于实现页面级别的缓存。通过在 `web.xml` 文件中配置,我们可以指定哪些页面或一组页面需要被缓存。当客户访问并返回 HTTP 状态码为 200(表示访问成功)...
除了静态配置文件外,osCache还支持动态编程配置,可以在代码中通过`CacheManager`实例创建和管理缓存。例如: ```java import net.sf.oscache.CacheManager; CacheManager.init("oscache.properties"); // 初始化...
osCache支持多种缓存失效策略,如定时刷新、手动清除等。 - 监控和性能优化:定期检查osCache的性能,如内存占用、缓存命中率等,以便进行优化调整。 总结来说,osCache是一个强大且灵活的缓存工具,它可以与...
- **缓存同步**: 在分布式环境中,osCache可以通过JGroups实现缓存的同步,确保多节点间缓存的一致性。 - **缓存监听器**: 可以注册监听器(CacheEventListener),在缓存项的添加、更新、移除等事件发生时执行相应...
### Oscache框架的搭建与应用详解 在现代Web开发中,缓存技术是提升...Oscache不仅简化了缓存机制的实现,还提供了丰富的定制选项,使得开发者能够根据具体需求灵活调整缓存策略,从而优化用户体验和服务器资源利用。
osCache是Java平台上的一个高效的缓存解决方案,主要用于在应用程序中缓存数据,以提高性能和减少数据库的负载。这个工具特别适用于那些需要频繁访问但更新不频繁的数据,例如经常查询但很少更改的数据库记录。...
OSCache是开源的Java缓存框架,能够帮助开发者实现高效的页面和数据缓存,从而降低数据库的访问压力,提高应用的响应速度。 一、缓存整个页面 OSCache组件提供的`CacheFilter`是一个关键元素,它能对整个动态页面...