今天520,要及时「缓存」你们的珍贵时光。(一)

简介: 在很久很久以前人类和洪水作斗争的过程中,水库发挥了至关重要的作用 : 在发洪水时可以蓄水,缓解洪水对下游的冲击;在干旱时可以把库存的水释放出来以供人们使用。这里的水库就起着缓存的作用。在如今互联网的世界里随着互联网的普及,内容信息越来越复杂,用户数和访问量越来越大,我们的应用需要支撑更多的并发量,同时我们的应用服务器和数据库服务器所做的计算也越来越多。



 缓存概述


在很久很久以前人类和洪水作斗争的过程中,水库发挥了至关重要的作用 : 在发洪水时可以蓄水,缓解洪水对下游的冲击;在干旱时可以把库存的水释放出来以供人们使用。这里的水库就起着缓存的作用。在如今互联网的世界里随着互联网的普及,内容信息越来越复杂,用户数和访问量越来越大,我们的应用需要支撑更多的并发量,同时我们的应用服务器数据库服务器所做的计算也越来越多。

但是往往我们的应用服务器资源是有限的,且服务器技术变革是缓慢的,数据库每秒能接受的请求次数也是有限的,那么如何能够有效利用有限的资源来提供尽可能大的吞吐量呢?一个有效的办法就是引入缓存,打破标准流程,每个环节中请求可以从缓存中直接获取目标数据并返回,从而减少计算量,有效提升响应速度,让有限的资源服务更多的用户。


 缓存的定义


缓存就是数据交换的缓冲区(称作Cache),这个概念最初是来自于内存和 CPU。当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接使用执行,缓存找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。



 缓存的分类


当用户从键入一个地址到页面的展示过程中通常包含了很多种缓存。有前端缓存、本地缓存(协商缓存,强缓存等)到我们的网关缓存(CDN 缓存)、最后到我们服务端缓存。服务端缓存又区分为进程缓存(本地缓存),还有比较火的分布式缓存,最后到了数据库层面的缓存。如下图所示:

微信图片_20220414192752.png


缓存是一把双刃剑


在我们通常的软件设计中,有一些热点数据需要展示到页面,我们通常当这些数据缓存到内存或者其他读写速度优异的框架中。减少与数据库进行 I/O 操作。提升数据的响应速度。这一切看起来就是这么完美。

实际上,在缓存系统的设计架构中,还有很多坑。如果设计不当会导致很多严重的后果。设计不当,轻则请求变慢、性能降低,重则会数据不一致、系统可用性降低,甚至会导致缓存雪崩,整个系统无法对外提供服务。

接下来我们着重讲述一下在缓存设计过程中几大经典的问题。


缓存失效

先解释一下什么叫做缓存失效

我们在存放缓存的时候,可以指定缓存 Key 的失效时间,当失效时间到了,此缓存就会失效,由于在缓存中找不到该数据,所以这个时候如果用户有请求该数据就绕过缓存直接到数据库中请求数据。

看到这里小伙伴们肯定有很多问号?

微信图片_20220414192757.png

这不是很正常的现象嘛?为什么要把这个问题拿出来说呢?莫急看下图图示

微信图片_20220414192800.png

这里我们通过两个场景来说明一下

  • 场景一:这种情况下一般不会对数据库造成比较严重的影响,因为失效的 key 的数量比较少,即使同时请求到数据库层面也是可以接受的。
  • 场景二:在这种场景中,当缓存里面的大量 Key 同时失效,这个时候如果有请求过来,会穿过失效的 Key全部落到数据库层面。导致数据库的负荷瞬间添加。可能会出现数据库宕机等特大事故。

解决方案

看到这里很多聪明的小伙伴其实已经想到了。场景 2 的事故主要因为很多 key 一起失效的原因,跟我们日常写缓存的过期时间息息相关。如果我们在日常的开发过程中需要将一批 Key 设置到缓存中并制定失效时间。这个时候就要注意场景 2 发生的情况。我们可以在失效时间 + 随机时间。避免大量 Key 失效冲击我们的数据库。

微信图片_20220414192805.png

缓存击穿

通常情况下,我们去查询数据都是存在的。那么如果请求去查询一条压根儿数据库中根本就不存在的数据,也就是缓存和数据库都查询不到的这条数据会怎么样呢?这样会导致每次访问都会直接打到数据库上面去。这种查询不存在数据的现象我们称为缓存穿透

下面是缓存失效的场景

很多伙伴看到这里肯定又会觉得这是一件很正常的事情。试想一下,如果有黑客会对你的系统进行攻击,拿一个不存在的 key 不停的去查询数据,会产生大量的请求到数据库去查询。可能会导致你的数据库由于压力过大而宕掉。

微信图片_20220414192814.png

相关文章
|
6月前
|
数据库
周末时光不浪费学起来
周末时光不浪费学起来
33 3
|
12月前
|
存储 编译器 C语言
【这个“数据在内存中的存储(1)”讲解我能吹一辈子】
【这个“数据在内存中的存储(1)”讲解我能吹一辈子】
69 0
|
开发工具 Python
嗖嗖的,再也不怕被嘲笑了!!!
嗖嗖的,再也不怕被嘲笑了!!!
|
C语言
我读书少,你们得帮帮我
我读书少,你们得帮帮我
|
存储 JSON JavaScript
听说你情人节没人陪,这不我来给你介绍对象啦
听说你情人节没人陪,这不我来给你介绍对象啦
226 0
听说你情人节没人陪,这不我来给你介绍对象啦
|
存储 缓存 前端开发
表弟面试被虐,我教他缓存连招,借机蹭了波奈雪的茶
表弟面试被虐,我教他缓存连招,借机蹭了波奈雪的茶
表弟面试被虐,我教他缓存连招,借机蹭了波奈雪的茶
|
设计模式 存储 移动开发
从十分后悔到紧张应对金九银十的我全靠着这份资料
前言 相信有些小伙伴是年前辞职,结果赶上了疫情,在家里一呆就是几个月!许多人都在家吃喝玩乐而荒废了自己的知识。而我也不例外。本来我已经对今年的面试不抱有任何的希望。但当我看到这份资料时,我在心中不经又产生了希望。让我从浪费时间的自责中开始变得紧张复习起来。
从十分后悔到紧张应对金九银十的我全靠着这份资料
|
缓存 监控 算法
今天520,要及时「缓存」你们的珍贵时光。(二)
在很久很久以前人类和洪水作斗争的过程中,水库发挥了至关重要的作用 : 在发洪水时可以蓄水,缓解洪水对下游的冲击;在干旱时可以把库存的水释放出来以供人们使用。这里的水库就起着缓存的作用。在如今互联网的世界里随着互联网的普及,内容信息越来越复杂,用户数和访问量越来越大,我们的应用需要支撑更多的并发量,同时我们的应用服务器和数据库服务器所做的计算也越来越多。
今天520,要及时「缓存」你们的珍贵时光。(二)
|
算法 搜索推荐 程序员
学弟学妹们,学会霍夫曼编码后,再也不用担心网络带宽了!(1)
学弟学妹们,学会霍夫曼编码后,再也不用担心网络带宽了!
117 0
学弟学妹们,学会霍夫曼编码后,再也不用担心网络带宽了!(1)
|
Java
学弟学妹们,学会霍夫曼编码后,再也不用担心网络带宽了!(2)
学弟学妹们,学会霍夫曼编码后,再也不用担心网络带宽了!
123 0
学弟学妹们,学会霍夫曼编码后,再也不用担心网络带宽了!(2)
下一篇
无影云桌面