第四部分:小结及其引申
缓存是在提升系统响应时常用的一种技术,在系统缓存上通常采用的是有页面缓存、处理缓存和数据缓存
这三种具体的类别,应该说这三种缓存在实现上还是稍有不同,尽管底层的缓存实现是一样的。
页面缓存
页面缓存是指对页面中的内容片断进行缓存的方案。比如页面中有一个部分是显示栏目中的内容的,那么就可以缓存这个部分,在进行第二次请求的时候就直接从缓存中取出这部分的内容
(
其实就是这部分的
html
了
)
,这种情况下,缓存的作用其实非常明显,在典型的
action+service+dao
这样的结构中,在采用页面缓存后就意味着不需要经过
action
、
service
、
dao
这些层次的处理了,而是直接就返回了,对于系统响应速度的提升来说是非常明显的。
页面缓存通常采用
oscache
来进行实现,
oscache
提供了一个
jsp tag
,可通过这个
tag
来包含需要缓存的内容部分,当然,缓存的这个内容部分需要有对服务器的请求或逻辑计算等的,可想而知,去缓存一段静态
html
是没有意义的。
其次需要定义缓存的这段内容的
key
,例如我们要去缓存页面中某个栏目的某页的内容,对于这段内容而言唯一的
key
就是栏目
ID
以及当前页数,这样就组成了这段缓存的
key
了,其实这个部分看起来好像是很简单,但有些时候会很麻烦,要仔细的想清楚这段内容的唯一的标识的
key
到底是什么,
^_^
,通常的做法其实可以从
action
中需要获取的参数或
service
接口的参数来决定
....
页
面缓存中还需要做的一个步骤就是通知缓存需要更新,页面缓存和其他缓存稍有不同,需要告诉它,这个时候不能再使用缓存中的内容了,需要从后台再重新获取来
生成新的缓存内容,这个其实很简单,因为很难在后台发生变化的时候自己来更新缓存的内容,只能是去通知它,然后让它再次发起请求来生成新的内容放入缓存
中。
页面的缓存的使用对于系统的响应速度确实会有很大的提升,在实现页面缓存时最麻烦的主要是缓存的
key
的定义以及缓存更新的通知,缓存
key
的定义这个自然框架是没法解决的,不过缓存更新的通知其实在框架中可以考虑一种通知模型的,
^_^
,就像事件通知那样
........
在实际的项目中,可以自己去实现一个这样的通知模型或者就是简单的采用单例方式来标识某个
key
是否需要更新。
页面缓存在实际的项目中使用非常的多。
处理缓存
处理缓存是指对于
action
、
service
、
dao
或者系统层次中的某方法进行缓存,说直接点,就是对某个类的某个方法的结果做缓存,这样在下次进行完全相同的请求的时候就可以直接取缓存了,这种响应速度的提升也是非常明显的。
处理缓存在现在的情况下其实采用任务的缓存工具包都可以实现,如
oscache
、
ehcache
、
jbosscache
等,但目前还没有处理缓存框架的出现,这个和处理缓存是否应该存在的意义也是有关系的,处理缓存框架要做到的其实就像拦截一样的方式,和
oscache tag
类似。
同样,处理缓存的麻烦也在于怎么样去定义这个
key
,很多情况下可以根据方法的输入作为
key
,方法的输出作为
key
的值,但也会有其他一些复杂的情况,这个时候定义
key
就会变得复杂些了。
处理缓存同样有通知更新缓存的情况,和页面缓存基本是一样的。
应该说,处理缓存和页面缓存非常的相似,从实现上来说基本是完全一致的,在使用上来讲处理缓存使用的好像不多。
数据缓存
数据缓存估计大家都很熟悉,就是对系统的数据进行缓存的方式,典型的就是
Hibernate
的一级、二级数据缓存。
数据缓存在实现上如果是用
hibernate
的话更多的是直接使用
hibernate
的一级、二级以及查询缓存,如果自己要实现的话可以去参考
hibernate
的实现机制。
数据缓存的
key
在一级、二级缓存中采用的都是数据的标识键的值的方式,查询缓存采用的是查询参数、查询语句的方式。
数据缓存的更新则是
hibernate
在进行存储时直接更新缓存的内容,而对于查询缓存则是采用全部直接清除的方式,这样在下次进行查询时自然会重新去查询,
^_^
,大家可能会想,为什么页面缓存和处理缓存不采用这样的方式来实现缓存的更新,稍微想想就知道了,在后台发生改变的时候其实是不知道需要移除哪些
key
的,所以
hibernate
为了避免这个麻烦,采用的就是当数据一旦发生改变的时候就清除全部的查询缓存,而不是只去清除相关的缓存,其实这里可以采用一种订阅式的模型,呵呵,当然,也增加了框架的复杂度。
数据缓存使用的应该是最多的,效果也是很明显的。
以上三种缓存是目前缓存实现时通常碰到的三种状况,里面按使用的多少来排序应该是:数据缓存、页面缓存和处理缓存;实现的难度上从难到易的顺序应该是:处理缓存、页面缓存、数据缓存;对于系统响应速度提升的效果来说从最好到好的顺序应该是:页面缓存、处理缓存、数据缓存。
补充部分:
在
SSH
项目应用中,可以以对象的形式来缓存展现给用户的数据信息。对象的缓存要充分利用分组带来的好处(可以分组
删除被缓存的对象
),这样在执行数据库的
CUD
操作时,可以调用删除相应组别的缓存对象。
示例代码:
private CacheManager cm;
private final static String CACHE_KEY_SUB="RetJobs";
public JobAction() {
//获取缓存管理对象
cm = CacheManager.getInstance();
}
查询部分
page=(Page<RetJob>)(cm.get(CACHE_KEY_SUB+"_"+currentPage));
if(page==null){
//--------------------需要缓存对象部分-----------------------
page = retJobBaseModel.getJobs(currentPage, pageSize, statusCondition);
//-------------------------------------------
//缓存对象(含所属分组信息)
cm.put(page, CACHE_KEY_SUB+"_"+currentPage,new String[]{CACHE_KEY_SUB});
}
CUD操作部分
setCacheDisabled(CACHE_KEY_SUB);
private void setCacheDisabled(String group) {
//通过组别信息来删除缓存的对象。
cm.removeObjectByGroup(group);
}
CacheManager
类
public class CacheManager {
private BaseCache newsCache;
private static CacheManager instance;
private static Object lock = new Object();
private CacheManager() {
// 这个根据配置文件来,初始BaseCache而已;
newsCache = new BaseCache("hrms", 300);
}
public static CacheManager getInstance() {
if (instance == null) {
synchronized (lock) {
if (instance == null) {
instance = new CacheManager();
}
}
}
return instance;
}
public void put(Object news,String key,String[] groups) {
newsCache.put(key, news,groups);
}
public void remove(String key) {
newsCache.remove(key);
}
public Object get(String key) {
try {
return newsCache.get(key);
} catch (Exception e) {
return null;
}
}
public void removeAll() {
newsCache.removeAll();
}
public void removeObjectByGroup(String group){
newsCache.removeObjectByGroup(group);
}
}
BaseCache
类增加的
2
个方法如下:
// 添加被缓存的对象;
public void put(String key, Object value,String[] groups) {
this.putInCache(this.keyPrefix + "_" + key, value,groups);
}
//删除该组的缓存对象
public void removeObjectByGroup(String group){
this.flushGroup(group);
}
参阅资料:
[0]
:
http://www.opensymphony.com/oscache/
[1]
:
OSCache
简介
[2]
:
OSCache分析
[3]
:
OSCache——学习笔记
[4]
:
应用
OSCache提升
J2EE系统运行性能
[5]
:
[Java]用
OSCache进行缓存对象
[6]
:
osCache
配置说明
[7]
:
缓存漫谈
分享到:
相关推荐
Cache技术--OSCache JAVA开发者必须研究的cache的架构
oscache缓存技术入门实例
oscache.tld oscache.tld oscache.tld
oscache缓存技术,压缩包中有详细代码及步骤
描述了oscahce在JAVA开发中的应用和配置说明
Cache是一种用于提高系统响应速度、改善系统运行性能的技术。尤其是在Web应用中,通过缓存页面的输出结果,可以很显著的改善系统运行性能。 OSCache标记库由OpenSymphony设计,它是一种开创性的缓存方案,它提供了在...
oscache的简单介绍
缓存技术 oscache-2.3.2.jar包下载
Cache是一种用于提高系统响应速度、改善系统运行性能的技术。尤其是在Web应用中,通过缓存页面的输出结果,可以很显著的改善系统运行性能。 OSCache标记库由OpenSymphony设计,它是一种开创性的缓存方案,它提供了在...
javaweb做页面缓存常用,OSCache是一个工业级的J2EE缓存实现。OSCache不但能缓存java对象,还可以缓存页面,http请求和二进制内容,...通过应用OSCache,我们不但可以实现通常的Cache功能,还能够改善系统的稳定性。
oscache.properties 博文链接:https://xdjava.iteye.com/blog/1040936
oscache-2.1.jar oscache-2.1.jar
Cache是一种用于提高系统响应速度、改善系统运行性能的技术。尤其是在Web应用中,通过缓存页面的输出结果,可以很显著的改善系统运行性能。 OSCache标记库由OpenSymphony设计,它是一种开创性的缓存方案,它提供了在...
OSCache由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能。OSCache是一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决...
OSCache学习例子 实例 很好的与j2ee结合
1、OSCache是什么? 2、OSCache的特点 3、有关“用OSCache进行缓存对象”的研究
OSCache标记库由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能。OSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的...
OSCache标记库由OpenSymphony设计,它是一种开创性的缓存方案,它提供了在现有JSP页面之内实现内存缓存的功能。OSCache是个一个被广泛采用的高性能的J2EE缓存框架,OSCache还能应用于任何Java应用程序的普通的缓存...
使用oscache进行缓存,大大提高web系统运行效率
OSCache是OpenSymphony这个开源项目众多Projects中的一个。他是一个高效的J2EE缓存框架,能够很好的解决动态网站速度的问题。