一、缓存
1、什么是缓存?
缓存是硬件,是CPU中的组件,CPU存取数据的速度非常的快,一秒钟能够存取、处理十亿条指令和数据(术语:CPU主频1G),而内存就慢很多,快的内存能够达到几十兆就不错了,可见两者的速度差异是多么的大 ,缓存是为了解决CPU和内存两者速度差异问题的中间媒体,将CPU访问频率较高的数据从内存读入缓存,从而提高软件执行效率。
以上是硬件中缓存,软件中的缓存的定义更为广泛一些,实现的方式也更多一些,但目的是一样的,都是复制常用的数据到内存中方便CPU的快读读取(注意:通过java的原理可以看出java不能操作缓存,不过可以给缓存建议存储那些数据)。缓存的基本思想是以空间换时间。我们知道,IO的读写速度相对内存来说是比较慢的,通常一个web应用的瓶颈就出现在磁盘IO的读写上。那么,如果我们在内存中建立一个存储区,将数据缓存起来,当浏览器端由请求到达的时候,直接从内存中获取相应的数据,这样一来可以降低服务器的压力,二来,可以提高请求的响应速度,提升用户体验。
2、java项目中常用的实现缓存的发方式有哪些?
2.1 数据库数据缓存
一般来说,web应用业务逻辑业务逻辑比较复杂,数据库繁多,要获取某个完整的数据,往往要多次读取数据库,或者使用极其复杂效率较低的SQL查询语句。为了提高查询的性能,将查询后的数据放到内存中进行缓存,下次查询时,直接从内存缓存直接返回,提高响应效率。
比如mysql、oracle等本身的缓存机制可以实现数据缓存,有时页面同样的请求,后面的请求时间比第一次请求明显短,就是数据库数据缓存的作用,另外通过调正数据库的字段类型和索引、序列等可以优化查询效率。
2.2 应用层缓存
应用层缓存是指我们在代码层面上做的缓存。通过代码逻辑,把曾经请求过的数据或资源等,缓存起来,再次需要数据时通过逻辑上的处理选择可用的缓存的数据。应用层缓存主要针对某个业务方法进行缓存,有些业务对象逻辑比较复杂,可能涉及到多次数据库读写或者其他消耗较高的操作,应用层缓存可以将复杂的业务逻辑解放出来,降低服务器压力。
2.3 页面缓存(浏览器缓存)
除了IO外,web应用的另一大瓶颈就是页面模板的渲染。每次请求都需要从业务逻辑层获取相应的model,并将其渲染成对应的HTML。一般来说,web应用读取数据的需求比更新数据的需求大很多,大多数情况下,某个请求返回的HTML是一样的,因此直接将HTML缓存起来也是缓存的一个主流做法。
2.4 代理服务器缓存
正向代理需要用户浏览器进行配置,反向代理需要先配置DNS服务器,然后接受用户浏览请求,转发请求给远程服务器。反向代理服务器是浏览器和源服务器之间的中间服务器,浏览器先向这个中间服务器发起Web请求,经过处理后(比如权限验证,缓存匹配等),再将请求转发到源服务器。代理服务器缓存的运作原理跟浏览器的运作原理差不多,只是规模更大。可以把它理解为一个共享缓存,不只为一个用户服务,一般为大量用户提供服务,因此在减少相应时间和带宽使用方面很有效,同一个副本会被重用多次。常见的反向代理服务器:Nginx是软件。
2.5 CDN缓存
CDN( ContentDeliveryNetwork 内容分发网络)缓存,也叫网关缓存、反向代理缓存。浏览器先向CDN网关发起Web请求,网关服务器后面对应着一台或多台负载均衡源服务器,会根据它们的负载请求,动态将请求转发到合适的源服务器上。虽然这种架构负载均衡源服务器之间的缓存没法共享,但却拥有更好的处扩展性。CDN是一集群服务器网络,不是软件。
2.6 基于spring的缓存
spring作为一个成熟的java web 框架,自身有一套完善的缓存机制,同时,spring还未其他缓存的实现提供了扩展。接下来,让我们在一个简单的学生管理系统中尝试spring的数据库缓存、应用层缓存、页面缓存的实现。