粗浅看 缓存技术

来源:互联网 发布:网络信息安全工程师 编辑:程序博客网 时间:2024/05/16 15:32

概述

首先我们来了解缓存是什么,解决什么问题?

Cache是高速缓冲存储器一种特殊的存储器子系统,其中复制了频繁使用的数据以利快速访问;

凡是位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为Cache。

基于Web应用的系统架构图


Web 应用系统存在哪些速度差异?

读取文件系统→读取磁盘

读取数据库内存→读取文件系统

读取应用内存→访问数据库服务器

读取静态文件→访问应用服务器

读取浏览器缓存→访问网站

分类

其代表主要有操作系统、数据库、应用程序、Web服务器和客户端浏览器中,下面分别介绍:

操作系统磁盘缓存→减少磁盘机械操作

数据库缓存→减少文件系统I/O

应用程序缓存→减少对数据库的查询

Web服务器缓存→减少应用服务器请求

客户端浏览器缓存→减少对网站的访问

操作系统

Windows的Disk Cache


Linux的Disk Cache


数据库

数据库缓存的重要性

为什么数据库非常依赖缓存?

①数据库通常是企业应用系统最核心的部分;

②数据库保存的数据量通常非常庞大;

③数据库查询操作通常和频繁,有时还很复杂;

④以上原因造成数据库查询会引起非常频繁的磁盘I/O读取操作,迫使CPU挂起等待,数据库性能极度低下。

数据库有哪些缓存策略?

①Query Cache;

②Data Buffer。

Query Cache

以SQL作为key值缓存查询结果集;

一旦查询设计的表记录被修改,缓存就会被自动删除;

设置合适的Query Cache会极大提高数据库性能;

Query Cache并非越大越好,过大的QueryCache会浪费内存;

MySQL:query_cache_size = 128M。

MySQLQuery Cache 监控工具

Show status like ‘Qcache%’;

Mysqlreport脚本;

MySQL Administrator。

Query Cache状态demo


Data Buffer

data buffer是数据库数据在内存中的容器;

data buffer的命中率直接决定了数据库的性能;

data buffer越大越好,多多益善;

MySQL的InnoDB buffe:

Innodb_buffer_pool_size = 2G

MySQL建议buffer pool开大到服务器物理内存60%~80%。

MySQL buffer监控工具

show innpdb status\G;

show status like ‘innodb%’;

mysqlreport脚本;

innotop

InnoDB buffer状态demo


应用程序

大概分为:对象缓存;查询缓存;页面缓存:动态页面静态化;Servlet缓存;页面内部缓存。下面分别介绍:

对象缓存

由O/R Mapping框架例如Hibernate提供,透明性访问,细颗粒度缓存数据库查询结果,无需业务代码显示编程,是最省事的缓存策略。

当软件结构按照O/R Mapping框架的要求进行针对性设计,使用对象缓存将会极大降低Web系统对于数据库的访问要求。

良好的设计数据库结构和利用对象缓存,能够提供极高的性能,对象缓存适合OLTP(联机事务处理)应用。 

对象缓存分类

对映射数据库记录的entity对象进行缓存。

对1对n关系的集合进行缓存。

对n对1的关联对象进行缓存。

Hibernate对象缓存配置

配置entity对象缓存

@Entity@Cache(usage =CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)public class Forest{…}配置关联集合的缓存@OneToMany(cascade =CascadeType.ALL,fetch = FectchTYPE.EAGER)@JoinColumn(name = “CUST_ID”)@Cache(usage =CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)public SortedSetSet<Ticket>getTickets() { return tickets;}

仅仅添加Annotion就可以了,无需编码,即可自动享受对象缓存。Hibernate会拦截对象的CRUD操作,针对对象读取操作进行缓存,针对对象修改操作自动清理缓存。

Hibernate二级缓存是提升web应用性能的法宝

OLTP类型的Web应用,由于应用服务器端可以进行集群水平扩展,最终的系统瓶颈总是逃不开数据库访问;

哪个框架能够最大限度减少数据库访问,降低数据库访问压力,哪个框架提供的性能就更高;

针对数据库的缓存策略:

对象缓存:细颗粒度,针对表的记录级别,透明化访问,在不改变程序代码的情况下可以极大提升web应用的性能。对象缓存是ORM的制胜法宝。

对象缓存的优劣取决于框架实现的水平,Hibernate是目前已知对象缓存最强大的开源ORM;

查询缓存:粗颗粒度,针对查询结果集,应用于数据实时化要求不高的应用。

查询缓存

对数据库查询结果集进行缓存,类似数据库的QueryCache;

适用于一些耗时,但是时效性要求比较低的场景。查询缓存和对象缓存适用的场景不一样,是互为补充的;

当查询结果集涉及的表记录被修改以后,需要注意清理缓存。

Hibernate 查询缓存

在配置文件中打开Query Cache

Hibernate.cache.use_query_cachetrue

在查询的时候显示编码使用Cache

List blogs = sess.createQuery(“fromBlog blog where blog.blogger = :blogger”).setEntity(“blogger”,blogger).setMaxResults(15).setCacheable(true).setCacheRegion(“frontpages”).list().

Hibernate查询缓存特征

并非缓存整个查询结果集,而是缓存查询结果集entity对象的id集合。

[blog1,blog2,blog3,…];

在遍历结果集的时候,再按照blogld去查询blog对象,例如selectblog.* from where id = ?

如果此时blog配置了对象缓存,则自动读取对象缓存。

Hibernate查询缓存会自动清理过期缓存。

一旦结果集涉及的entity被修改,查询缓存就被自动清理。

页面缓存

页面缓存的作用是什么?

针对页面的缓存技术不但可以减轻数据库服务器压力,还可以减轻应用服务器压力;

好的页面缓存可以极大提高页面渲染速度;

页面缓存的难点在于如何清理过期的缓存。

页面缓存技术有哪些?

动态页面静态化;Servlet缓存;页面局部缓存。

动态页面静态化

利用模板技术将访问过一次的动态页面生成静态html,同时修改页面链接,下一次请求直接访问静态链接页面;

动态页面静态化技术的广泛应用于互联网CMS/新闻类Web应用,但也有BBS应用使用该技术,例如Discuz!

无法进行权限验证,无法显示个性化信息;

可以使用AJAX请求弥补动态页面静态化的某些缺点。

Servlet 缓存

针对URL访问返回的页面结果进行缓存,适用于粗粒度的页面缓存,例如新闻发布;

可以进行权限的检查;

OScache提供了简单的Servlet缓存(通过web.xml中的配置);

也可以自己编程实现Servlet缓存。

OSCache Servlet缓存demo

<fliter>      <filter-name>CacheFilter</filter-name>      <filter-class>com.opensymphony.oscache.web.filter.CacherFilter</filter-class>      <init-param>    <param-name>time<param-name>    <param-value>600<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>/news/*</url-pattern></filter-mapping> 

页面局部缓存

针对动态网页的局部片断内容进行缓存,适用于一些个性化但不经常更行的页面(例如博客);

OSCache提供了简单的页面缓存;

可以自行扩展JSP Tag实现页面局部缓存。 

CSCache的页面局部缓存

<%@ taglib uri=http://opensymphony.com/oscache prefix=”cache”%><cache:cache>       …some jsp content…</cache:cache> <cache:cache key=”footbar”scope=”session”>      …some jsp content…</cache:cache> <cache:cache key=”<%=product.getId() %>” time=”1800” refresh=”<%= needRefresh %>”>      …some jsp content…</cache:cache> <cache:cache key=”,%product.getId() %” cron=”0 2 ***” refresh=”%= needRefresh %”>…some jsp content…</cache:cache>

Web服务器

EHCache

适合充当对象缓存个Hibernate继承效果很好,GavinKing也是EHCache作者之一。

OSCache

充当Servlet和页面缓存;在一个Web应用中可以同时使用OSCache和EHCache。

JBossCache

在JAVA集群环境下使用;支持缓存在节点之前的复制,在JBossAS上被用来实现HTTP Session的内存复制功能。

非Java实现的通用缓存产品

Memcahed

在大规模互联网下使用;

每秒支撑1.5万~2万次请求。

Tokyo Tyrant

兼容memcached协议,可以持久化存储;

支持故障切换,对缓存器有高可靠性要求可以使用;

每秒支撑0.5万~0.8万次请求.

客户端浏览器

基于 AJAX 技术的浏览器缓存

使用AJAX调用的时候,将数据库在浏览器端缓存;

只要不离开当前页面,不刷新当前页面,就可以直接读取缓存数据;

只适用于AJAX技术的页面。

基于HTTP协议的资源缓存


基于资源的缓存demo 

<filter>     <filter-name>CacheFilterStaticContent</filter-name>     <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>     <init-param>    <param-name>expires</param-name>    <param-vlaue>time</param-vlaue>     </init-param></filter> <filter-mapping>     <filter-name>CacheFilterStaticContent</filter-name>     <url-pattern>*.jsp</url-pattern></filter-mapping>

业务思想

关于缓存技术的介绍基本上就是个人的理解,其中,在很早以前个人对于缓存的理解呢,就是你的“速度”赶不上我的“速度”,我需要找个树林歇一会儿等等你,就是缓存嘛。了解其基本原理还是很简单的,大家有什么补充的,欢迎交流。

 

1 0
原创粉丝点击