高并发系统-缓存(一)-为什么需要缓存

文本主要总结缓存在系统中的作用

1. 缓存定义

缓存是一种存储技术,用于临时存储和快速访问经常需要的数据 。它是在计算机系统中使用的一种高速存储介质或存储空间,用于存储最近或频繁访问的数据,以便将来能够更快地提取和使用这些数据。

缓存的作用是对数据的请求能够更快的返回

1.1 硬件访问耗时

主要看下面两张图

从这些数据中,你可以看到,做一次内存寻址大概需要 100ns,而做一次磁盘的查找则需要 10ms。 使用内存作为缓存的存储介质相比于以磁盘作为主要存储介质的数据库来说,性能上会提高多个数量级,同时也能够支撑更高的并发量。

1.2 缓存宽泛定义

缓存作为一种常见的空间换时间 的性能优化手段,凡是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构,均可称之为缓存。

缓存设计思想

  • 使用更快的介质,比方说内存
  • 缓存复杂运算的结果

2. 缓存案例

下面主要讲述几个常见缓存案例场景

2.1 一次HTTP请求调用涉及缓存

从一次HTTP请求调用过程阐述其中涉及到的缓存,其大致流程如下:

  1. DNS解析域名得到IP地址

    • 涉及到DNS缓存,主要是域名和IP的映射
  2. 客户端与服务器建立连接(TCP三次握手)

    • TCP连接可用Keep-Alive复用连接,不用每次都创建
  3. 客户端发起请求

    • 浏览器本身有缓存策略,通过请求头信息来控制是强缓存(Expires、Cache-control)还是协商缓存(Last-Modified、ETag)
  4. 请求经过代理服务(网关、ELB),根据策略调用不同服务

    • 代理服务器会检查是否存在缓存的副本,并且如果资源未过期,则直接返回缓存的副本,而无需访问目标服务器
    • 代理服务器常见如NGNIX
  5. 如果是静态资源,通过内容分发网络(CDN)获取

    • CDN缓存
  6. 如果是业务请求,后端应用服务器接收到请求,进行相应业务处理发回

    • 服务端缓存,涉及到REDIS缓存、本地内存缓存
    • 调用数据库,涉及到数据库比如MYSQL本身缓存Buffer Poll等
  7. 客户端拿到请求到的数据

  8. 客户端渲染页面(返回数据做本地缓存)

  9. web服务器断开连接

可以看到一次http调用,是一次前后端协调,经过多出的缓存处理

2.2 客户端图片滑动缓存

手机上默认图库(Gallery)APK,照片页上下滑动照片是一个比较典型缓存应用场景。 因为图片在手机上是文件存储的,显示到屏幕上涉及到一系列的加载解析渲染等。为了保证滑动体验,一般都是采用预加载图片的方式。

即刷新到某一块,实际后台加载区域比这要多一些。

2.3 Linux的TLB(Translation Lookaside Buffer)的组件

Linux 内存管理是通过一个叫做 MMU(Memory Management Unit)的硬件,来实现从虚拟地址到物理地址的转换的,但是如果每次转换都要做这么复杂计算的话,无疑会造成性能的损耗,所以我们会借助一个叫做 TLB(Translation Lookaside Buffer)的组件来缓存最近转换过的虚拟地址,和物理地址的映射。TLB 就是一种缓存组件,缓存复杂运算的结果。

3. 缓存分类

3.1 静态缓存

静态页面、图片、视频 可通过NGNIX或者CDN部署

3.2 分布式缓存

Memcached、Redis

可以突破单机的限制,针对动态缓存

3.3 热点本地缓存

遇到极端的热点数据 查询的时候。热点本地缓存主要部署在应用服务器的代码中,用于阻挡热点查询对于分布式缓存节点或者数据库的压力。

比如热点的配置信息

4. 缓冲区

缓冲区则是一块临时存储数据的区域,这些数据后面会被传输到其他设备上。

缓冲区也是用以弥补高速设备和低速设备通信时的速度差

缓冲区可以是一个内存区域,也可以是硬件设备中的一部分。它可以用来存储输入数据、输出数据或中间数据,以及在数据传输过程中进行数据的临时存储和处理。

在输入方面,缓冲区用于接收和存储来自外部设备(如键盘、鼠标、网络连接)的数据,以便后续处理。例如,当用户在键盘上输入字符时,字符首先被存储在缓冲区中,然后被逐个读取并处理。

在输出方面,缓冲区用于存储要发送到外部设备(如显示器、打印机、网络连接)的数据。数据被写入缓冲区后,可以按照适当的时机进行发送,以满足设备的处理速度或网络传输的要求。

4.1 举例

数据写入磁盘时并不是直接刷盘,而是写到一块缓冲区里面,内核会标识这个缓冲区为脏。当经过一定时间或者脏缓冲区比例到达一定阈值时,由单独的线程把脏块刷新到硬盘上。这样避免了每次写数据都要刷盘带来的性能问题。

5. 总结

缓存时使用好处前面已经讲了,但是会带来一些问题

  • 缓存使用会给系统带来复杂度,存在数据不一致的风险,需要解决
  • 缓存很多使用内存作为存储介质,但是内存不是无限的,需要注意容量
  • 缓存一般适用读多写少的场景,需要具备热点属性,否则缓存意义不大
  • 缓存给运维带来一定成本

参考
CPU Cache:访问存储速度是如何大幅提升的?
客户端浏览器一次http完整请求过程流程图(图文结合诠释请求过程)
前端理解的HTTP缓存(缓存的过程/策略/控制机制/作用和应用)

相关推荐
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭9 分钟前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
工业甲酰苯胺9 分钟前
分布式系统架构:服务容错
数据库·架构
暮湫25 分钟前
泛型(2)
java
超爱吃士力架30 分钟前
邀请逻辑
java·linux·后端
南宫生35 分钟前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石43 分钟前
12/21java基础
java
李小白661 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp1 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶2 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb