粗浅看 缓存技术
来源:互联网 发布:网络信息安全工程师 编辑:程序博客网 时间: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>
业务思想
关于缓存技术的介绍基本上就是个人的理解,其中,在很早以前个人对于缓存的理解呢,就是你的“速度”赶不上我的“速度”,我需要找个树林歇一会儿等等你,就是缓存嘛。了解其基本原理还是很简单的,大家有什么补充的,欢迎交流。
- 粗浅看 缓存技术
- 粗浅看 XML
- 粗浅看 Servlet
- 粗浅看 JNDI原理
- ifconfig粗浅技术
- 粗浅看 JSP工作原理
- 粗浅看 java反射机制
- 粗浅看 java反射机制
- 粗浅看 深度解析Java内存原型
- 粗浅看 Tomcat系统架构分析
- 粗浅看 Tomcat系统架构分析
- 粗浅看 Tomcat中设计模式分析
- 粗浅看 逆波兰式算法
- 粗浅看Struts2和Hibernate框架
- 粗浅看Struts2和Hibernate框架
- 技术前沿 看Flex客户端缓存技术如何使用
- 从HTTP响应头看各家CDN缓存技术
- 粗浅看 Web基础架构:负载均衡和LVS
- 最长递增子序列 (Longest Increasing Subsequence)
- 优购微零售-已上线项目中,完全使用react-native的一些体会
- 设计模式:(3)生成器模式 (Builder)
- 声明父类,new子类--java和c#的区别
- Word技巧
- 粗浅看 缓存技术
- 数据结构_P13
- Minor GC、Major GC和Full GC之间的区别
- 强烈建议使用guava
- 电商之梳理dubbo相关知识---分布式架构
- 信息商品价格实例调查
- SQLite3的操作命令
- GOF 23种设计模式
- mvn基础知识学习