OSCache使用总结
1.介绍:
OSCache是一个广泛采用的高性能的J2EE缓存框架,能用于任何Java应用程序的缓存解决方案,它也是一种开创性的JSP地址标记应用,提供了在现有JSP页面之内实现快速缓冲功能。
2.特点:
可以缓存任何对象,不受限制的的缓存部分JSP页面或者HTTP请求。
永久缓存,缓存能随意的写入硬盘或者数据库
支持集群,集群缓存的数据能进行单个参数配置,不需要修改代码
缓存的有效期,可以最大限度的控制缓存对象的过期,包括可插入式刷新策略
3.配置:
cache.memory:值为true或false,默认为用内存作为缓存(如果设置为false,那么擦车只能缓存到硬盘或数据库中)
cache.capacity:缓存元素个数
cache.persistenece.class:持久化缓存类,如此类打开,必须修改oscache.properties中的cache.path信息(win系统类路径类似为c:\\web\\cacheinfo,unix系统类路径类似为/opt/web/cacheinfo)
cache.cluster 设置集群相关信息,如:cache.cluster.multicast.ip为广播IP地址,cache.cluster.properties为集群属性
4.缓存过滤
在web.xml中定义缓存过滤器,定义缓存特定资源(cacheFilte只捕获http头为200的页面请求)
5.oscache和hashmap的比较:
在多线程环境中oscache比hashmap的并发性好,hashmap是对整个hashmap加锁,而oscache是对各个缓存对象更新加锁
oscache的cache是由并发读,互斥写机制实现的,可以失效读的并发,但不支持并发写,jdk1.5下的concurrentHashMap是支持并发读和并发写的一个map,其性能会更高
6.oscache主要有三类操作(getFromCache,putInCache,removeEntry):
第一次调用getFromCache会抛异常,抛异常的时候标示需要更新缓存(putInCache),而且一定要对缓存更新或者取消更新,否则会占用缓存对象的锁,其他线程调用getFromCache的时候会被阻塞,更新缓存的时候调用putInCache,如果失败则调用cancelUpdate,否则也会阻塞其他线程,其中更新缓存状态的方法有cancelUpdate,completeUpdate,putInCache执行成功则会调用completeUpdate,否则应该调用cancelUpdate,而且getFromCache方法在缓存失效是会执行startUpdate也会改变缓存状态,这时需要调用cancelUpdate或者putInCache。
7.用到的jar包:
<dependency>
<groupId>opensymphony</groupId>
<artifactId>oscache</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
8.示例如下:
public class OSCacheUtils{
private GeneralCacheAdministrator cacheAdmin;
//获取缓存信息
public String getCacheInfo() {
// 加入oscache缓存,缓存的有效期是5分钟
try {
if (cacheAdmin == null) {
cacheAdmin = new GeneralCacheAdministrator();
}
Object result = cacheAdmin.getFromCache("mykey",
5 * 60);
if (result != null) {
return result.toString();
}
} catch (NeedsRefreshException e) {
try {
String str ="make your uncomfortable";
cacheAdmin.putInCache("mykey", str);
return str;
} catch (IOException e1) {
logger.error("error", e1);
}
} catch (Exception ex) {
cacheAdmin.cancelUpdate("mykey");
logger.error("error", ex);
}
return "error";
}
}
上一篇: 关于验证的相关注意事项总结
下一篇: OSCache 缓存解决方案