一、基本概述

OSCache标记库由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能。OSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案。

 OSCache的特点:

1. 缓存任意对象:可以不受限制的缓存JSP的一部分或是Http请求,任何的Java对象都可以被缓存。

2.全面的API:通过API可以完完全全的控制OSCache的任何特性。

3.持久缓存:我们可以把认为重要的数据缓存到硬盘上。

4.支持集群:集群缓存数据能被单个的进行参数配置,不需要修改代码。

5.缓存记录的过期:你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时)。

 

二、作用以及优缺点

可以使用内存、硬盘空间、同时使用内存和硬盘或者提供自己的其他资源(需要自己提供适配器)作为缓存区。使用内存作为缓存区将可以提供更好的性能

使用硬盘作为缓存区可以在服务器重起后迅速恢复缓存内容

同时使用内存和硬盘作为缓存区则可以减少对内存的占用

OSCache可解决动态网站问题

1. 缓存动态内容:其实我们的动态网页上一般只有一部分是动态的(表头,表尾一般是不变的),如果我们缓存整个网页显然不成,因为有部分是随着请求有可能变的。OSCache提供的方式是允许我们只缓存一部分网页。

2. 缓存2进制内容:产生的图片和PDF文件在服务器加载的时候非常的耗时。OSCache解决这个问题是通过一个Servlet2.3的缓存过滤功能,然后能够缓存任意的URI(比如一个完整的页面或者是一个产生的图片/PDF文件)

 3. 容错:有这种情况或许我们会遇到,就是当一个动态的网页出现错误。即便我们的页面有95%都加载完毕,但就是由于这个错误,整个页面就会

返回错误的提示或页面。OSCache允许我们提供出现错误时的缓存内容,如果出现就适时的提示出来了。

三、OSCache运行环境

如果用到OSCache Tag Library的话,需要Servlet2.3和JSP1.2的支持。如果是直接用OSCache API的话那么就不需要Servlet容器的支持。 
目前可以正常运行的Web容器:

1. OrionServer(版本1.4.0和更高)

2. JRun(3.0或更好)

3. WebLogic(8.1或以上)

4.Websphere(5.0或以上)

5. Resin(1.2.3或以上)

6. TomCat(4.0或以上)

7. iPlanet(6.0或以上)

用到缓存过滤需要Servlet2.3支持.目前知道的可以工作在OrionServer,WebLogic,Tomcat上. 
OSCache需要Java的版本至少是java 1.4.

四.OSCache的安装

1解压oscache-2.4.1-full后发现他下面有如下文件: 
2.把oscache-2.4.1.jar放到/WEB-INF/lib下. 
3.要确保commons-logging.jar也在环境变量中.一般情况下他也放在/WEB-INF/lib下. 
4. 把/etc/oscache.properties放入/WEB-INF/classes下

果用的Eclipse的话,建议新建一个 Source Folder

叫Src_Config,然后就这个OSCache的属性文件放在其中.

修改这个OSCache的配置文件可以改变文件缓存的磁盘路径

置持久侦听等等.

5.如果你的jdk版本为1.3.x,

在lib中加入Apache Common Lib 的commons-collections.jar包。

jdk是1.4以上则不必.如果是需要集群缓存的话,

jgroups.jar放入包中。
6.把etc/META-INF/oscache.tld也放在/WEB-INF/classes下. 
你的目录结构如下:

$WEB_APPLICATION\WEB-INF\lib\oscache.jar
$WEB_APPLICATION\WEB-INF\classes\oscache.properties
$WEB_APPLICATION\WEB-INF\classes\oscache.tld

1.cache.properties 文件配置向导

cache.memory  

值为true 或 false ,默认为在内存中作缓存,
如设置为false,那cache只能缓存到数据库或硬盘中,那cache还有什么意义

cache.persistence.class

持久化缓存类,如此类打开,则必须设置cache.path信息

cache.path

当使用磁盘缓存时,须指定目录如果不存在将被建立。同时注意

oscache应该要有权限写文件系统。

cache.path=c:\\myapp\\cache or *ix:

cache.path=/opt/myapp/cache

cache.capacity 缓存大小
cache.cluster.properties 为集群属性

cache.cluster.multicast.ip为广播IP地址

2.OSCache的基本用法

页面级缓存

应用OSCache的标签,我们必须先要引入进来.方式有两种

其一.在web.xml中加入:

<taglib>

<taglib-uri>oscache</taglib-uri>

<taglib-location>/WEB-INF/classes/oscache.tld</taglib-location>

</taglib>

然后我们在JSp中就可以<%@ taglib uri="oscache" prefix="os"%>这样来引用了.

其二,直接引用.直接在JSp中加入OSCache的标签库引用

<%@ taglib uri="/WEB- INF/classes/oscache.tld" prefix="os"%>.如果要进入官方的标签库的话也行<%@ taglib uri="http://www.opensymphony.com/oscache" prefix="cache"%>;这样就不用再把oscache.tld放在/WEB-INF/classes下了.

cache1.jsp 内容如下

<%@ taglib uri="/WEB-INF/classes/oscache.tld" prefix="cache" %>

<%@ page import="java.util.*" %>

<body>

没有缓存的日期: <%= new Date() %><p>

<!--自动刷新-->

<cache:cache time="30">

每30秒刷新缓存一次的日期: <%= new Date() %>

</cache:cache>

<br/>

<br/>

<!--手动刷新-->

<cache:cache key="testcache">

手动刷新缓存的日期: <%= new Date() %> <p>

</cache:cache>

<a href="cache2.jsp">手动刷新</a>

<!--不定义scope,scope默认为Applcation  -->

<cache:cache time="30" scope="session">

每30秒刷新缓存一次的日期: <%= new Date() %>

</cache:cache>

</body>

Cache2.jsp 内容如下

<body>

缓存已刷新...<p>

<cache:flush key="testcache" scope="application"/>

<a href="cache1.jsp">返回</a>

</body>

注意:

CacheFilter只捕获Http头为200的页面请求,即只对无错误请求作缓存,而不对其他请求(如500,404,400)作缓存处理

对象级缓存

BaseCache 类

public class BaseCache extends GeneralCacheAdministrator {

//  过期时间(单位为秒);

private int refreshPeriod;

//  关键字前缀字符;

private String keyPrefix;

/**

* <pre>构造器

@param keyPrefix

@param refreshPeriod</pre>

*/

public BaseCache(String keyPrefix,int refreshPeriod){

super();

this.keyPrefix = keyPrefix;

this.refreshPeriod = refreshPeriod;

}

//添加被缓存的对象;

public void put(String key,Object value){

//调用父类的putInCache(String key,Object content)方法

this.putInCache(this.keyPrefix + "_" + key,value);

}

//添加被缓存的对象+过期时间

public void put(String key, Object value, int time) {

this.putInCache(this.keyPrefix + "_" + key, value, new ExpiresRefreshPolicy(time));

}

public void removeAll(){

//调用父类的flushAll()方法

this.flushAll();

}

//在给定时间清除缓存的对象;   1

public void removeAll(Date date){

//调用父类的flushAll(Date date)方法

this.flushAll(date);

}

//删除被缓存的对象;

public void remove(String key){

//调用父类的flushEntry(String key)方法

this.flushEntry(this.keyPrefix + "_" + key);

}

//获取被缓存的对象;

public Object get(String key) throws Exception{

try{

return this.getFromCache(this.keyPrefix+"_"+key,this.refreshPeriod);

catch (NeedsRefreshException e) {

this.cancelUpdate(this.keyPrefix+"_"+key);

throw e;

}

}}

CacheManager 类

public class CacheManager {

private BaseCache userCache;

private static CacheManager instance;

private static Object lock = new Object();

private CacheManager() {

//这个根据配置文件来,初始BaseCache

baseCache = new BaseCache("CacheManager",120);

}

/**

* <pre>getInstance(单例化一个   CacheManager 单例模式:双重判定锁)

@return CacheManager 对象</pre>

*/

public static CacheManager getInstance(){

if (instance == null){

synchronizedlock ){

if (instance == null){

instance = new CacheManager();

}

}

}

return instance;

}

/**

* <pre>putUser(将对象存入缓存中)

@param 对象 </pre>

*/

public void putObj(String id,Object obj) {

baseCache.put(id,obj);

}

/**

* <pre>putObj(添加被缓存的对象+过期时间)

@param id

@param obj

@param time</pre>

*/

public void putObj(String id,Object obj,int time) {

baseCache.put(id, obj, time);

}

/**

* <pre>removeUser(根据id 缓存中的对象移除)

@param id</pre>

*/

public void removeObj(String id) {

baseCache.remove(id);

}

/**

* <pre>removeAllUser(删除缓存中所有的对象)

*/

public void removeAllObj(){

baseCache.removeAll();

}

/**

* <pre>removeAllUser(根据时间清除 缓存中所有的对象)

*/

public void removeAllObj(Date date){

baseCache.removeAll(date);

}

/**

* <pre>getUser(根据id 从缓存中提取对应的对象)

@param  id

@return 对象 </pre>

*/

public Object getObj(String id,Object obj) {

try {

return baseCache.get(id);

catch (Exception e) {

System.out.println("get>>id["+id+"]>>"+e.getMessage());

User user = new User(id);

this.putObj(id, obj);

return user;

}

}     }

测试类

public static void main(String[] args) {

//将对象存入缓存中

CacheManager instance = CacheManager.getInstance();

//实例化一个用户对象

User user =new User();

user.setId("001");

user.setName("莉莉");

user.setSex("男");

user.setAge(15);

// 添加 缓存的对象

instance.putObj(user.getId(), user);

//添加 缓存的对象+过期时间

//instance.putObj(user.getId(), user, 5);

//从缓存中删除所有的用户对象

//instance.removeAllObj();

//从缓存中删除用户id 为001 的用户

//instance.removeObj(user.getId());

//在**时间从缓存中清除对象

//instance.removeAllObj(new Date());

//根据id 从缓存中取得用户数据

User userInfo = (User) instance.getObj(user.getId(), user);

System.out.println("User id is  "+userInfo.getId());

System.out.println("User name is  "+userInfo.getName());

System.out.println("User sex is  "+userInfo.getSex());

System.out.println("User age is  "+userInfo.getAge());

}

五、小结:

OSCache的使用主要有4种

POJO 缓存 
HTTP Response 缓存

在web.xml中定义缓存过滤器,定义特定资源的缓存

<!-- 缓存过滤器 -->

<filter>

<filter-name>CacheFilter</filter-name>

<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>

<init-param>

<!-- 缓存刷新时间 -->

<param-name>time</param-name>

<param-value>60</param-value>

</init-param>

<init-param>

<!-- 缓存作用域  -->

<param-name>scope</param-name>

<param-value>session</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>CacheFilter</filter-name>

<url-pattern>*.jsp</url-pattern>

</filter-mapping>

上面定义将缓存所有.jsp页面,缓存刷新时间为60秒,缓存作用域为Session

注意,只有返回状态为200(HttpServletResponse.SC_OK)的内容才会被缓存

JSP Tag Library 缓存

O/R Data Access 缓存

OScached页面缓存的概念和安装的更多相关文章

  1. OScached页面缓存知识总结一

    OSCache页面缓存 什么是OSCache? OSCache标记库由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能.OSCache ...

  2. OScached页面缓存的入门使用

    OSCache的使用: 一,环境的搭建: 1,把oscache.jar file放在 /WEB-INF/lib 目录下(Put the oscache.jar file in the /WEB-INF ...

  3. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  4. Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  5. Nginx 反向代理、负载均衡、页面缓存、URL重写、读写分离及简单双机热备详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx  (windows下nginx安装.配置与使用) 四.Nginx之反向代理 五.Nginx之负载均衡  (负载均衡算法:nginx负载算法 up ...

  6. Nginx反向代理 负载均衡 页面缓存 URL重写及读写分离

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  7. [转载]Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  8. (转)Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    原文:http://blog.51cto.com/freeloda/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Ng ...

  9. (转) ASP.NET页面缓存

    原文:http://www.cnblogs.com/Sky_KWolf/archive/2010/12/05/1897158.html 静态页面全部内容保存在服务器内存中.当再有请求时,系统将缓存中的 ...

随机推荐

  1. 11.24Daily Scrum(3)

    人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频浏览的功能.研究相关的代码和功能.1002 数据库测试 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.1003 实现视频浏览的功能 ...

  2. 3ds Max学习日记(八)

      再来更新一波学习进度.   之前玩了一下3dsmax里的灯光,不过由于和教程里的版本不同,教程里的我的没有,我有的教程又没有,所以只能瞎jb玩一玩.   最近又想建个人物模型玩玩,于是上网搜一下有 ...

  3. 201621044079WEEK作业08-集合

    作业08-集合 1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 如 ...

  4. 【bzoj4842】[Neerc2016]Delight for a Cat 线性规划与网络流

    题目描述 $n$ 个连续的位置,每个位置可以填入 S 和 E ,第 $i$ 个位置填入 S 可以获得 $s_i$ 的收益,填入 E 可以获得 $e_i$ 的收益.要求每连续的 $k$ 个位置必须包含至 ...

  5. web服务器压测工具siege、ab

    web服务器压测工具也挺多,这里只介绍我用过的这两种--siege(for linux).ab(for windows). 一.siege 1.简介: Siege是一款开源的压力测试工具,设计用于评估 ...

  6. WIN7系统插入蓝牙适配器经常断开问题

    WIN7 ACER笔记本一台,蓝牙耳机一个,10块钱的蓝牙适配器一个 目的:可以在笔记本上用适配器与蓝牙耳机匹配 出现问题:1.有2个图标,一会左边感叹号,一会右边感叹号,必须有个存在感叹号 解决:第 ...

  7. 具体数学二项式至生成函数章-----致敬Kunth

    关于标题取得这么奇怪.因为在具体数学中.这两章是分开叙述的.并且分别叙述得淋漓尽致! 我只参悟其中关于生成函数的一小部分内容(暂时于我够用了.) 提二项式系数之前不得不提组合数.以往在高中用的是符号C ...

  8. [NOIP2015 TG D2T3]运输计划

    题目大意: 给你一棵n个节点的树,有边权,有多个任务,每个要求从ui号节点到 vi号节点去.m 个计划, 这 m 个计划会同时开始.当这 m 个任务都完成时,工作完成. 现在可以把任意一个边的边权变为 ...

  9. [NOI.AC省选模拟赛3.31] 星辰大海 [半平面交]

    题面 传送门 思路 懒得解释了......也是比较简单的结论 但是自己看到几何就退缩了...... 下周之内写一个计算几何的学习笔记! Code #include<iostream> #i ...

  10. POJ2826:An Easy Problem?!——题解(配特殊情况图)

    http://poj.org/problem?id=2826 题目大意:给两条线,让它接竖直下的雨,问其能装多少横截面积的雨. ———————————————————————————— 水题,看题目即 ...