缓存是在提升系统响应时常用的一种技术,在我之前的blog中也提及过好几次这部分的技术,今天还是想从缓存涉及的一些方面再次的去谈谈,在系统缓存上通常采用的是有页面缓存、处理缓存和数据缓存这三种具体的类别,应该说这三种缓存在实现上还是稍有不同,尽管底层的缓存实现是一样的。
页面缓存
页面缓存是指对页面中的内容片断进行缓存的方案。比如页面中有一个部分是显示栏目中的内容的,那么就可以缓存这个部分,在进行第二次请求的时候就直接从缓存中取出这部分的内容(其实就是这部分的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为了避免这个麻烦,采用的就是当数据一旦发生改变的时候就清除全部的查询缓存,而不是只去清除相关的缓存,其实这里可以采用一种订阅式的模型,呵呵,当然,也增加了框架的复杂度。
数据缓存使用的应该是最多的,效果也是很明显的。
以上三种缓存是目前缓存实现时通常碰到的三种状况,里面按使用的多少来排序应该是:数据缓存、页面缓存和处理缓存;实现的难度上从难到易的顺序应该是:处理缓存、页面缓存、数据缓存;对于系统响应速度提升的效果来说从最好到好的顺序应该是:页面缓存、处理缓存、数据缓存。
转自http://www.blogjava.net/BlueDavy/archive/2006/06/02/50076.html
分享到:
相关推荐
计算机缓存是现代计算系统中不可或缺的一部分,它在提高数据访问速度、优化系统性能方面扮演着关键角色。本文将深入探讨缓存的工作原理、常见类型以及如何利用缓存提升应用程序的效率。 首先,缓存的基本原理是利用...
代理可以在访问前/后执行额外操作,如缓存、安全控制等。代理模式的代码实现可能包括静态代理和动态代理(如Java的`java.lang.reflect.Proxy`)。 6. **观察者模式**:定义对象间的一对多依赖关系,当一个对象的...
### 架构模式与实践漫谈知识点 #### 架构原则 在探讨架构模式与实践时,文章首先介绍了多个重要的架构原则。这些原则是构建稳定、高效、可维护系统的基石。 - **抽象化(Abstraction)**: 关注于隐藏复杂的现实情况,...
在UNIX服务器全系列处理器的比较中,我们可以看到IBM的POWER7在多核、时钟频率、缓存大小以及多线程技术上均表现卓越。与HP的Itanium2系列相比,POWER7不仅在技术参数上有明显优势,而且在产品迭代和升级路径上更为...
- **CDN**:利用内容分发网络缓存静态资源,降低服务器负载。 #### 最佳实践 - **读写分离**:通过复制主数据库至从数据库,分散读操作压力。 - **集群与高可用**:通过负载均衡技术和多节点部署,实现系统高可用...
### 漫谈 Linux 文件 I/O #### 一、引言 在 Linux 开发领域,技术人员尤为关注几个关键性能指标:进程管理、CPU 使用率、内存占用、网络 I/O 和磁盘 I/O。其中,磁盘 I/O 性能尤其重要,因为它直接影响到系统的响应...
在“数据库系统设计漫谈”中,讲师童家旺,一位阿里集团的数据库架构师,探讨了一系列关键概念和实践。 首先,数据库基本问题的调查引出了各种类型的数据库系统,包括传统的Oracle、DB2、SQL Server、MySQL和...
响应头字段如Set-Cookie用于向客户端发送cookie,而ETag、Last-Modified、Expires和Cache-Control则用于控制内容的缓存。 HTTP的扩展话题: HTTP协议不仅仅局限于传输文本数据,它支持多种内容类型,包括文本、图片...
在早期,赛扬处理器基于奔腾Ⅱ内核,例如赛扬266和300,它们集成了MMX指令集,但在缺少奔腾Ⅱ所具备的L2高速缓存的情况下,其在商业应用中的性能表现并不尽人意。然而,赛扬300A和333的推出,带来了128KB全速L2缓存...
Django支持多种缓存后端,如内存缓存(如memcached)和键值存储(如Redis)。这些缓存系统可以用于存储静态文件、数据库查询结果等,减少对数据库的访问,提高响应速度。 对于大规模部署,Django应用通常会结合...
童家旺的《数据库系统设计漫谈》深入浅出地探讨了这一主题。本文将详细解析其中的关键知识点。 首先,数据库基本问题调查中提到,不同类型的数据库在实际应用中有各自的优缺点。传统的数据库系统如Oracle、DB2、SQL...
CPU的编号通常包含了丰富的信息,包括制造商、型号、生产工艺、频率、缓存大小以及产地等,这些信息对于用户选择合适的CPU以及理解其性能至关重要。 在Intel的CPU中,编号的结构比较复杂,例如“FV524RX366”的366...
2. **高效的开发**:通过提供预定义的服务,如状态管理、持久化服务和分布式共享数据对象缓存,J2EE减少了开发人员编写底层代码的工作量,使他们能够专注于业务逻辑,从而加快了开发速度。 3. **支持异构环境**:...
正确设置SGA的大小至关重要,因为它作为高速缓存,直接影响数据读取速度。LRU算法用于管理缓冲区的空间。 3. **规范与反规范设计**:规范化减少数据冗余,提升增删改操作效率,但可能导致查询性能下降。反规范化则...
超线程技术在英特尔的处理器中广泛应用,例如文中提到的奔腾4处理器,通过增加工作频率和缓存容量来提升速度的同时,引入超线程技术,使得处理器的执行单元在空闲时可以处理其他线程,提高了计算效率。对于那些执行...
连接池则保持连接的缓存,尽量重用已存在的连接,减少创建和关闭连接的频率。这两种技术在大型系统如Websphere、Tomcat和数据库中广泛使用,但它们并非万能解决方案,因为池的大小有限,当请求量超出池的容量时,...
HCIE周刊第九期多时间片缓存技术.pdf HCIE周刊第十期二层隔离技术漫谈一、二.pdf HCIE周刊第十一期SIP协议.pdf HCIE周刊第十二期DNSBL技术.pdf HCIE周刊第十三期HyperMetro.pdf HCIE周刊第十四期二层隔离技术漫谈三....
4. 数据缓存策略,比如何时使用本地缓存来提升用户体验和减少不必要的网络请求。 Elm架构,尽管是针对Web前端开发设计的,但由于其核心思想在函数式编程和响应式编程上的应用,它的一些概念也被部分iOS开发者所采用...