今天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

相关文章
|
云安全 安全 小程序
无影-阿里云第一款云电脑,它拥有超越PC的完美体验
无影是一款面向数字经济时代的生产力工具,基于流式传输服务和容器化架构,可实现随时随地云上办公、海量算力触手可得、海量应用一网打尽,依托阿里云打造云管端一体化安全防护体系,全面保障企业业务和数据安全,拥有超越PC的便捷、流畅、安全、高效体验。
27373 0
无影-阿里云第一款云电脑,它拥有超越PC的完美体验
|
8月前
|
存储 Linux 网络安全
linux应急响应检查脚本
通过这个脚本,可以快速收集系统的关键信息,有助于在发生问题时进行及时的应急响应和分析。
254 34
|
10月前
|
人工智能 自然语言处理 供应链
《AI引领传统企业:数字化转型与商业创新的破局之路》
在当今时代,AI为传统企业带来数字化转型和商业创新的机遇。通过数据分析、精准决策、业务流程优化、产品服务创新、营销渠道拓展及人才管理,AI助力企业提升效率、降低成本、增强竞争力。企业需转变思维、加大技术投入、培养AI人才,建立适应转型的企业文化,以充分挖掘AI潜力,实现可持续发展。
575 15
|
10月前
|
机器学习/深度学习 人工智能 搜索推荐
AI技术在医疗领域的应用与前景####
本文深入探讨了人工智能(AI)技术在医疗健康领域中的多维度应用,从疾病诊断、个性化治疗到健康管理,展现了AI如何革新传统医疗模式。通过分析当前实践案例与最新研究成果,文章揭示了AI技术提升医疗服务效率、精准度及患者体验的巨大潜力,并展望了其在未来医疗体系中不可或缺的地位。 ####
|
11月前
|
存储 数据可视化 API
ModelScope魔搭11月版本发布月报
ModelScope 11月更新来袭!本次更新依然是干货满满的一期。
|
项目管理
PMP-干系人管理
PMP-干系人管理
207 0
|
Java
小程序中base64解码/编码
很多人都在为小程序如何实现base64编码/解码困扰,于是我参考前端大佬们对JavaScript中实现base64的文章进行了改写。简单实现了一个。。希望能帮助到小程序开发一线的大家吧、 不多说直接上代码: /** * UTF16和UTF8转换对照表 * U+00000000 – U+000000...
5155 13
|
缓存 JavaScript 前端开发
|
Ubuntu Java Linux
使用阿里云服务器开我的世界基岩版服务器
想和好友玩我的世界手机版但是不在同一个局域网那么这是你们最好的选择,那就是自己动手开一个。
1079 0
使用阿里云服务器开我的世界基岩版服务器
|
Web App开发 算法 安全
计算机操作系统——操作系统概述(学习笔记)
控制和管理整个计算机系统的硬件和软件资源 合理地组织调度计算机的工作和资源分配 提供给用户和其他软件方便的接口和环境 计算机系统中最基本的系统软件
648 0
计算机操作系统——操作系统概述(学习笔记)