java缓存技术总结

一、什么是缓存

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

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

二、缓存的分类

1、基于web应用的系统架构图

2、在系统架构的不同层级之间,为了加快访问速度,都可以存在缓存

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

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

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

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

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

三、操作系统缓存

1、文件系统提供的Disk Cache:操作系统会把经常访问到的文件内容放入到内存当中,由文件系统来管理

2、当应用程序通过文件系统访问磁盘文件的时候,操作系统从Disk Cache当中读取文件内容,加速了文件读取速度

3、Disk Cache由操作系统来自动管理,一般不用人工干预,但应当保证物理内存充足,以便于操作系统可以使用尽量多的内存充当Disk Cache,加速文件读取速度

4、特殊的应用程序对文件系统Disk Cache有很高的要求,会绕开文件系统Disk Cache,直接访问磁盘分区,自己实现Disk

5、Cache策略

Oracle的raw device(裸设备) – 直接抛弃文件系统

MySQL的InnoDB: innodb_flush_method = O_DIRECT

四、数据库缓存

1、重要性

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

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

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

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

2、缓存策略

a、Query Cache

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

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

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

Query Cache并非越大越好,过大的Qquery Cache会浪费内存。

MySQL: query_cache_size= 128M

b、Data Buffer

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

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

data buffer越大越好,多多益善

MySQL的InnoDB buffer:innodb_buffer_pool_size = 2G

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

五、应用程序缓存

1、对象缓存

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

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

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

2、查询缓存

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

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

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

3、页面缓存

a、作用

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

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

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

b、分类

I、动态页面静态化

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

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

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

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

II、Servlet缓存

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

可以进行权限的检查

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

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

III、页面内部缓存

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

OSCache提供了简单的页面缓存

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

六、web服务器端缓存

基于代理服务器模式的Web服务器端缓存,如squid/nginx

Web服务器缓存技术被用来实现CDN(内容分发网络 content delivery network)

被国内主流门户网站大量采用

不需要编程,但仅限于新闻发布类网站,页面实时性要求不高

七、基于ajax的浏览器缓存

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

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

只适用于使用AJAX技术的页面

本文来自企鹅号 - java版web项目媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

墨菲定律:一个参数Drop_caches导致集群数据库实例崩溃

李真旭@killdb Oracle ACE,云和恩墨技术专家 个人博客:www.killdb.com 在墨菲定律里,我们知道,有可能发生的故障就一定会发生,哪怕...

3137
来自专栏java闲聊

Error response from daemon: dial tcp: lookup index.docker.io on : i/o timeout

ps:有时候docker重启会恢复这个网络配置,留意下(在新版本中第二种方法会不奏效,推送的更新谨慎升级)

1063
来自专栏我是攻城师

为什么说Elasticsearch搜索是近实时的?

37713
来自专栏Java架构师历程

MySQL分布式(XA)事务

存储引擎的事务特性能够保证在存储引擎级别实现ACID。而分布式事务则让存储引擎级别的ACID可以扩展到数据库层面,甚至可以扩展到多个数据库之间–这需要两阶段提交...

2043
来自专栏数据和云

MySQL Group Replication 学习笔记

作者简介 ? 刘伟 云和开创高级顾问 题记:group replication作为mysql官方,在5.7版本阶段开发的,innodb的分布式数据库架构,从发...

3636
来自专栏腾讯云服务器团队的专栏

腾讯云 CBS 性能测试用例参考

2、fio测试建议在空闲的、未保存重要数据的硬盘上进行,并在测试完后重新制作文件系统。请不要在业务数据硬盘上测试,避免底层文件系统元数据损坏导致数据损坏。

51513
来自专栏IT技术精选文摘

网站海量数据和高并发解决方案(一)

现在无论是企业的业务系统还是互联网上的网站程序都面临着数据量大的问题,这个问题如果解决不好将严重的影响系统的运行速度,下面就针对这个问题的各种解决解决方案进行介...

4115
来自专栏北京马哥教育

Linux 运维必备的 13 款实用工具,拿好了~

本文介绍几款 Linux 运维比较实用的工具,希望对 Linux 运维人员有所帮助。 1. 查看进程占用带宽情况 - Nethogs Nethogs 是一个...

4198
来自专栏乐沙弥的世界

Percona XtraDB Cluster集群状态监控(PXC 5.7)

每个节点可以有不同的集群视图。没有集中化监视节点。为了追踪问题的来源,您必须独立监控每个节点。

900
来自专栏IT技术精选文摘

有赞MySQL自动化运维之路—ZanDB

一、前言 在互联网时代,业务规模常常出现爆发式的增长。快速的实例交付,数据库优化以及备份管理等任务都对DBA产生了更高的要求,单纯的凭借记忆力去管理那几十套DB...

2808

扫码关注云+社区

领取腾讯云代金券