缓存的作用|学习笔记

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 快速学习缓存的作用

开发者学堂课程【高校精品课-厦门大学 -JavaEE 平台技术缓存的作用学习笔记,与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/80/detail/15925


缓存的作用


为什么要缓存?计算机在不同的层次上,处理时间是不一样的,在计算机系统中,最快的是 CPU的一级缓存和二级缓存,读取 CPU的一级缓存仅需要0.5纳秒。

如果说在 CPU的缓存的读取的代码中间包含了这个转移和分支预测的话,需要五纳秒,那读取二级缓存需要7纳秒。CPU 的一级和二级缓存是整个系统之间最快的部分,但是它也是容量最小的部分,所以一般不会把数据存储在一级缓存和二级缓存里,在一级缓存和二级缓存里主要存储的是代码以及在当前正在计算的数据。数据

主要存储在哪了?数据主要是先放在内存里。

内存读取1MB的数据,大概需要25万纳秒,那内存也是有限的。更多的数据是通过网络或者放在磁盘上的。在1G 的网络上,发送1MB的数据和读取1MB 的数据是差不多的,大概都需要1000万纳秒的时间。而在磁盘上,这个accd磁盘和机械磁盘是不一样的,知道 accd 磁盘的磁盘速度会比较快一些,但是accd的磁盘有一个问题,就是它会有寿命,就是它特别是写的寿命,擦除的寿命是有限的。机械磁盘的速度会稍慢一些,但是它的寿命会比较长。所以在这个系统中间,特别是用于存储数据的这个数据库上,往往还是采用了机械磁盘的这种方式。那机械磁盘的话,它的时间主要分成两个部分,知道一个是磁盘的寻道时间,还有一个是它读出和写入的时间,在机械磁盘上的寻道时间大概在1000万纳秒左右。那从这个磁盘上读出1MB的数据大概需要3000万纳秒左右,一般情况下大概在磁盘上读取读出1MB的数据大概需要4000万纳秒左右的时间。所以它的时间其实是比网络的传输的速度还要

稍慢一些。

从上面的分析可以知道啊,由于这个数据库是需要通过网络去访问的。因为数据库通常是一台独立的机器,而它又包含了大量的磁盘操作,所以说当整个系统的访问量非常大的时候,数据库就成为了整个系统的瓶颈。为了提高数据库的处理的性能,可以加大数据库的连接池和数据库的并发数同时处理数据的能力。但是这个加大的数量是有限的,因为最终它是受限于单台计算机的计算的能力,内存的资源以

及它的磁盘和网络访问的能力。

所以说当单台的数据库服务器达到了一个瓶颈的时候,就会采用一些高并发负载均衡以及分布式数据库这样的一些技术,把单台的数据库服务器变成多台的数据库服务器,或者在数据库服务器上都进行这种分库分表的一些操作。但是这一些操作既需要花费很大的人力,比如说要去做分库分表的话,实际上在程序上需要去做一些修改。比如说要去做负载平衡的话,实际上要花相当大的精力在这个配置上。同样又需要花费大量的资金,因为它是从一台数据库变成了多台数据库,所以在硬件和网络上的投资会增加。所以说在采用常用的提高处理能力的这种多数据库或者数据库集群的技术的之前往往会采用一种更加经济而且有效的方式来减轻数据库的复

杂,这就是缓存的技术。

缓存的技术,其实在整个系统的各个地方都是可以使用到的。这样的一个系统,通常可以分为这么几个部分,前端客户端,前端或者是用基于网页的或者基于app的这样的一个前端。然后如果基于网页的这个系统的,通常还会有一个web服务器,

因为一些静态的数据,静态的网页,静态的图片在 web 部服务器上。

在外服务器后面,会有这个应用服务器,应用服务器是用来运行JAVA程序。执行这个业务逻辑的计算的,那再往后才是数据库服务器。这个缓存的概念,也就是在处理数据的时候,不是说所有的数据都要从数据库里头去读取。因为前面知道数据库是当处理量大的时候,就是整个系统的瓶颈。在前面的这些所有的地方都可以去做一些缓存来减轻后面系统的压力。

image.png

从最开始的这个前端的系统开始说起,在前端是用如果说基于网页的系统的话是用JavaScript 来写的,那 JavaScript是可以把一些常用的只读的数据把它存储在JavaScript 对象中间。这样的话,它就不需要频繁的向后端去发出请求,去读取这些数据。那如果说是 app 的话,当然它本身就是用 JAVA语言写的,它也能够很方便的把一些常用的只读数据存储在这个前端的应用程序里。

web 层的话,通常的构造方式是用这个 NGINX服务器和 varnish 服务器来做 web服务器。其中 NGINX 服务器主要是用来处理静态的资源的,那当然NGINX服务器也可以把访问的数据当做一个静态资源存储在这个服务器上,这称之为静态的缓存。所以当第一次访问这样的一个请求的时候,它获得的数据,NGINX 会存在磁盘上,那之后再去访问的时候,它就会从磁盘上把它读出来。然后直接返回给前端,这样使得后面的机器根本就不会来处理这样的一个请求。varnish服务器跟NGINX 服务器类似,但是它不同的地方在于说它的缓存不是在磁盘上,而是在这个

内存里。

内存里的速度会比磁盘上读取速度要快很多。所以说 varnish 服务器是一个比NGINX 服务器做缓存更快的一个解决方案。所以往往会用 NGINX去处理静态的这个资源,用 varnish 去处理作为动态数据的这样的一个缓存。那当然用内存做缓存存在的一些问题,因为内存是有限的,所以 varnish 设计了更复杂的把它导出和导入的这样的一种机制,这个是在web服务器上做缓存。在 web 可以做的缓存,通常

是一些相对比较固定的数据。比如说一些枚举的信息,比如前端的一些状态者值。那个通常来说是不太会发生改变的,就可以把它缓存在这个 web 服务器上去。应用

服务器是做缓存的一个主力啊,那应用服务器做缓存的方式主要是有这么三种,一种是我们应用服务器本身是可以做缓存的。比如说用 spring的框架来做应用服务器的话,可以在 spring框架中间做一个 single lidebing,这里存储了一些数据。这样的话,在每次要考完这些数据的时候,就不用去数据库里去拿了,直接可以从它的中间去拿到这些数据,这是一个最简单的这个应用服务器的缓存的方式。

那当然应用服务器本身在使用数据库的时候,数据库的 orm框架,比如说 MyBatis或者 Hibernate的时候,它们都有提供了这个一级缓存和二级缓存的这样的一种机制。当然还有第三种方式,就是当应用服务器不是一台的时候,希望在多台服务器的之间去共享缓存数据,也就是前面的第一种那种缓冲方式是每台应用服务器有自己的缓存。那因为有自己的缓存的话,会带来很多的副作用,首先不说它会占用每一台应用服务器的内存,更主要的是这些缓存如果要更新的话,其实是非常不方便的。因为它没有统一的存在一个地方,可能有些应用服务器的缓存被更新了,有些就没有更新。

这样会造成数据的错误。所以对这样一种有可能会被更新的缓存数据,更多的会采用第三种方案,就是 Redis 的分布式缓存计数,为所有的应用服务器提供一个统一的服务器。然后把缓存的数据都放在 Redis的服务器上。Redis 服务器的缓存是通过内存来做的,通过网络去访问。所以从最开始的风气来说会比通过网络在磁盘上读取数据更快一些。所以从前面分析数据来看,在整个系统的各个部位都做缓存。

做缓存的依据是这样的,通常来说,只读数据或者是基本上没有的数据,可以往前

靠,把只读性比较大的放在前端服务器上,或者放到web服务器上。

当然也可以放在每一台应用服务器的内部的数据结构上,当然修改数据的不大的话,就不会出现应用服务器自己缓存的这样一个副作用。越往前靠的缓存,对于整体性能提升是非常明显的,越是只读性会修改东西,就越往后放,比如Redis的缓存

放的就是一些有可能会被修改的数据。

对于那些会频繁修改的数据来说实际上是没发将其放入缓存里的,那些数据只能依靠数据库来进行处理。所以通过使用缓存,可以看到把很多读的数据往前提从而减

轻了后端数据库的压力,从而使整体系统性能得到提升。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
缓存 NoSQL 关系型数据库
数据库缓存一致性学习笔记(一)
数据库缓存一致性学习笔记(一)
|
10月前
|
缓存 前端开发
前端学习笔记202306学习笔记第四十七天-vue-强制缓存3
前端学习笔记202306学习笔记第四十七天-vue-强制缓存3
54 0
|
1月前
|
存储 缓存 前端开发
《Webpack5 核心原理与应用实践》学习笔记-> webpack5持久化缓存
《Webpack5 核心原理与应用实践》学习笔记-> webpack5持久化缓存
137 1
|
8月前
|
缓存 NoSQL 算法
Redis学习笔记-缓存容量和淘汰机制核心思想
Redis学习笔记-缓存容量和淘汰机制核心思想
122 0
|
8月前
|
消息中间件 缓存 NoSQL
Redis学习笔记-如何解决缓存和数据库的数据不一致
Redis学习笔记-如何解决缓存和数据库的数据不一致
110 0
|
8月前
|
缓存 NoSQL 数据库
Redis学习笔记-如何应对缓存雪崩、击穿、穿透
Redis学习笔记-如何应对缓存雪崩、击穿、穿透
44 0
|
10月前
|
缓存 前端开发
前端学习笔记202307学习笔记第五十九天-react源码-双缓存技术
前端学习笔记202307学习笔记第五十九天-react源码-双缓存技术
56 0
前端学习笔记202307学习笔记第五十九天-react源码-双缓存技术
|
10月前
|
缓存 前端开发
前端学习笔记202306学习笔记第四十七天-vue-强制缓存2
前端学习笔记202306学习笔记第四十七天-vue-强制缓存2
60 0
|
10月前
|
缓存 前端开发
前端学习笔记202306学习笔记第四十七天-协商缓存1
前端学习笔记202306学习笔记第四十七天-协商缓存1
30 0
|
10月前
|
缓存 前端开发
前端学习笔记202306学习笔记第四十七天-协商缓存3
前端学习笔记202306学习笔记第四十七天-协商缓存3
32 0