浅析互联网中的缓存机制
zhezhongyun 2024-12-05 17:58 64 浏览
缓存,在互联网产品中可以简单理解为:第一次请求数据放到存储器中,下次显示该页面先把上次保存的数据显示出来,同时去请求数据,请求完成刷新显示新数据,并将其再缓存起来。
当今互联网应用(网站或App)的整体实现流程是:用户的请求从界面(浏览器或App界面)到网络传送、应用服务再到存储(数据库或文件系统),然后返回到界面呈现内容。
随着内容信息越来越复杂,用户数和访问量越来越大,我们的应用需要支撑更多的并发量,同时应用服务器和数据库服务器所做的计算也越来越多。但是往往我们的应用服务器资源是有限的,数据库每秒能接受的请求次数也是有限的(文件的读写也是有限的),如何能够有效利用有限的资源来提供尽可能大的吞吐量?一个有效的办法就是引入缓存,每个环节中请求可以从缓存中直接获取目标数据并返回,从而减少计算量,有效提升响应速度,让有限的资源服务更多的用户。
计算机缓存
计算机的缓存往往使用的是RAM(断电就掉的非永久储存),所以在用完后还是会把文件送到硬盘等存储器里永久存储。计算机里最大的缓存是内存条,最快的是CPU上镶嵌的L1和L2缓存,显卡的显存是给显卡运算芯片用的缓存,硬盘上也有16M或者32M的缓存。
其工作原理是当CPU要读取数据时,首先从CPU缓存中查找,找到就立即读取并送给CPU处理;如果没有找到,就从速率相对较慢的内存中读取并送给CPU处理,同时把这个数据所在的数据区块调入缓存中,可以使以后对整块数据的读取都从缓存中进行,不必再调用内存。这样的读取机制CPU读取缓存的命中率非常高,也就是说CPU下一次要读取的数据90%都在CPU缓存中,只有大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。
WEB浏览器缓存
下面我们进入正题。
浏览器会缓存它浏览过的「资源」(包括网页,图片等),如果资源在保质期内,那下次同样的请求直接用缓存。过期之后,会带上资源上次的修改时间,由服务器来判断是否失效,失效的话就会给浏览器返回新的数据并继续缓存下来。
浏览器的缓存,存在用户电脑的硬盘上,用户每次使用浏览器读取缓存时先将硬盘上的缓存数据加载到内存中,再读取给浏览器。
浏览器端缓存的规则主要在HTTP协议头和HTML的meta标签中定义。他们分别从新鲜度和校验值两个维度来规定浏览器是直接使用缓存中的数据,还是需要去源服务器获取更新的版本。
新鲜度(过期机制):缓存数据保质期。缓存数据必须满足以下条件,浏览器会认为它是有效的,足够新的:
- 含有完整的过期时间控制头信息(HTTP协议报文头),并且仍在有效期内
- 浏览器已经使用过这个缓存数据,并且在上一次会话中(也就是用户上一次访问该数据时)已经检查过其新鲜度
满足以上两个情况的一种,浏览器会直接从缓存中获取缓存数据并渲染给浏览器。
校验值(验证机制):服务器返回数据的时候有时在头信息中带上这个资源的实体标签,它可以用来作为浏览器再次请求过程的校验标识。如过发现校验标识不匹配,说明数据已经被修改或过期,浏览器需要重新获取数据内容。
HTTP缓存机制
还记得HTTP协议吗?在这篇文章中有对HTTP协议的简单介绍:浅析前后端数据交互
当用户通过浏览器发起一个数据请求的时候,浏览器会通过以下几步来获取数据:
- 本地缓存阶段:先在本地查找该数据,如果有发现该数据,而且该数据还没有过期,就使用此数据,不会发送http请求到服务器
- 协商缓存阶段:如果在本地缓存找到对应的数据,但是不知道该数据是否过期,则发一个HTTP请求到服务器,然后服务器判断这个请求,如果请求的数据在服务器上没有改动过或过期,则返回304状态码(可以理解为服务器给浏览器的暗号),让浏览器在本地找到该数据
- 缓存失败阶段:当服务器发现请求的资源已经修改过,或者这是一个新的请求,服务器则返回该数据,并且返回200状态码, 此过程的前提是指找到该数据,如果服务器上没有数据,则返回404(这个大家多见过吧,就是平时见到404页面时的状态码)
浏览器中的操作对缓存的影响
- 强制刷新:当按下ctrl+F5来刷新页面的时候,浏览器将绕过各种缓存(本地缓存和协商缓存), 直接让服务器返回最新数据
- 普通刷新:当按下F5或者点击刷新按钮来刷新页面的时候,浏览器将绕过本地缓存发送请求给服务器,此时协商缓存是有效的
- 回车或跳转:当在地址栏上输入回车或者按下跳转按钮的时候,所有缓存都生效
浏览器缓存机制
安卓、iOS缓存机制
APP上的缓存机制和浏览器缓存的原理类似,APP与服务器交互的协议同样是大多基于HTTP(S)。
先普及下基础知识:手机内存包括运行内存和内部存储。运行内存是用来运行程序的,不能用来永久存储数据,手机一旦关机或杀死进程,在内存中的所有数据都将会丢失。内部存储相当于计算机中的硬盘的角色,用于存储操作系统和应用程序的存储介质。
iOS的本地缓存数据存在磁盘存储(内部存储)中,由于Android手机通常将内部存储器固定在芯上,所以一般无法更换内部存储器的。 为了增强Android手机的存储能力,很多Android手机都支持扩展的SD卡(相当于计算机的U盘或者移动硬盘)功能。所以,Android手机存储缓存是可以选择数据存储位置的。
APP端存储数据的时候,会存储很多字段内容,一般情况下后台会给每条数据设定一个独立的id值,那么前端在请求数据的可以先查询本地缓存的数据中,最新的一条数据的id值,通过网络请求,把这个id值发给服务端,服务端会根据这个id在后台服务器中查询是否有比这个id值更大(更新)的数据存在,如果有就把新的数据返回给前端APP。
数据库缓存
数据库的缓存机制分为两个层面。
- 由数据库提供,可以对数据表建立的高速缓存。数据库的数据临时保存在一个位置上,再次同样的请求直接把这个数据返回去,而不需要再次去查询各种表取数据了,减少了查数据库的时间,提升效率。并不是所有的历史记录都缓存起来,要有策略,比如只缓存两个月的数据,并且两个月之前有请求过之后不再请求该数据的时候就会回收,就是把这条记录抹掉,就近多次请求的才会保存。时间过长、使用率不高的优先清除,要不然缓存太多就失去了缓存的本质和意义。
- 在数据库中,数据都是存放在磁盘中的。虽然数据库层做了对应的缓存,但这种数据库层次的缓存一般针对的是查询内容,一般只有表中数据没有变更的时候,数据库对应的缓存才发挥了作用。有时并不能减少业务系统对数据库产生的增、删、查、改产生的庞大压力。此时,一般的做法是在数据库与业务服务器之间增加一个缓存服务器,比如我们熟悉的redis。客户端第一次请求的数据从数据库拿出后就放到了redis中,数据不过期或不更改的前提下,下一次的请求都从redis中直接拿数据,这样做极大的缓解了数据库的压力。
服务器缓存
业务服务器缓存
业务服务器缓存是将动态页面直接生成静态的页面放在服务器上的硬盘里,用户调取相同页面时,静态页面将直接下载到客户端,不再需要通过程序的运行和数据库的访问,大大节约了服务器的负载。
每次访问页面时,会检测相应的缓存页面是否存在,若不存在,则连接数据库得到数据渲染页面并生成缓存页面文件,这样下次访问的页面文件就能发挥作用了。
举一个小例子:
用户A访问a页面,服务器解析a页面返回给用户A,同时在服务器内存上做一个映射,把a页面缓存在服务器的硬盘上。用户B访问a页面,服务器直接根据内存上的映射找到相应的页面缓存,直接返回给用户B。这样做减少了服务器对同以页面的重复解析。
代理服务器缓存
代理服务器是客户端和业务服务器之间的中间服务器,客户端先向这个中间服务器发起请求,经过处理后,再将请求转发到业务服务器。代理服务器缓存的运作原理跟浏览器的运作原理差不多,只是规模更大。可以把它理解为一个共享缓存,不只为一个用户服务,一般为大量用户提供服务,因此在减少相应时间和带宽使用方面很有效,同一个缓存数据会被重复使用多次。
以上,就是关于缓存机制的简单总结。产品汪们,再涉及项目中的缓存机制时,就不怕被程序猿们怼了!
作者:流年,互联网产品设计师,4年互联网产品设计经验。
本文由 @流年 原创发布于人人都是产品经理。未经许可,禁止转载。
题图由作者提供
相关推荐
- 写作排版简单三步就行-工具篇(作文排版编辑软件)
-
和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...
- CSS继承的元素属性小总结(css 继承性)
-
所有元素可继承:visibility和cursor内联元素和块级元素可继承:letter-spacingword-spacingwhite-spaceline-heightcolorfontfont-...
- Cube 技术解读 | Cube 小程序技术详解
-
作者:曾维宏(恒实)“本文为《Cube技术解读》系列第三篇文章,之前上线的《支付宝新一代动态化技术架构与选型综述》《Cube卡片技术栈解读》欢迎大家回顾。”小程序作为动态化或者跨端开发的一种技术栈...
- “战斗民族”这样为新生儿检查?(战斗民族)
-
<fontface="近日,一条被称为“俄罗斯新生儿检查”的视频在微博疯传,视频中检查者粗鲁的动作让网友们纷纷感染“怪不得是战斗民族”。视频真实性有待考证,但宝宝出生后确实需要马不停蹄地做一系...
- 实测,大模型谁更懂数据可视化?(实测,大模型谁更懂数据可视化技术)
-
大家好,我是Ai学习的老章看论文时,经常看到漂亮的图表,很多不知道是用什么工具绘制的,或者很想复刻类似图表。实测,大模型LaTeX公式识别,出乎预料前文,我用Kimi、Qwen-3-235B...
- 「Python爬虫」:破解网站字体加密和反反爬虫
-
前言:字体反爬,也是一种常见的反爬技术,例如58同城,猫眼电影票房,汽车之家,天眼查,实习僧等网站。这些网站采用了自定义的字体文件,在浏览器上正常显示,但是爬虫抓取下来的数据要么就是乱码,要么就是变成...
- 转录组及可视化分析——样本间相关性绘图
-
背景介绍在进行正式的转录组分析之前,一般可以先对样本的相关性进行绘图,用于观察各个组之间或组内样本的相关性。数据介绍数据的话我们采用的是送样测序公司反馈给我们的gene_count文件,格式如下:...
- 阿里巴巴矢量图标库 iconfont 的使用方法
-
xx-blog主题使用的图标库是阿里巴巴的iconfont,因此这里介绍一下此主题库的用法。首先去iconfont主题库,注册一个账号,然后就可以找自己喜欢的图标了,找到后点击添加购物车,就回到了右侧...
- 五行取名(五行取名的正确方法)
-
1、五行的分类原则以方位来论:东方属木;南方属火;西方属金;北方属水;中央属土。以季节来论:春季属木;夏季属火;秋季属金;冬季属水;季末属土。以气候来论:风属木;暑属火;燥属金;寒属水;湿属土。以颜色...
- 4K显示器软件界面字体过小解决方法
-
用4K显示器(win10或者win11下)的朋友会发现一些软件并不能随着系统的字体放大而放大字体,用起来很不方便。譬如常用的ps或者行业专用软件。笔者经过摸索,发现这样设置一下可以解决。下面以Psc...
- VBA之Word应用:利用Range方法进行字体及对齐方式设置
-
《VBA之Word应用》(版权10178982),是我推出第八套教程,教程是专门讲解VBA在Word中的应用,围绕“面向对象编程”讲解,首先让大家认识Word中VBA的对象,以及对象的属性、方法,然后...
- 办公小技巧:告别侵权 PPT字体自己造
-
很多朋友还不知道,我们每天面对的字体都是有版权保护的,如果对这方面的内容不了解,一不小心就可能造成侵权。那么我们在日常设计PPT文稿的时候,如何避免字体侵权呢?首先我们得懂得如何查看版权信息,另外还需...
- 显示器颜色显示有偏差?你校准过吗?
-
编辑:晴晨购物、拍照、做视频、玩游戏……看似不一样的操作都怕一件事:颜色有偏差。购物时商品颜色有出入,毫不知情的情况下把责任推给了商家,那么拍照、做视频、玩游戏呢?我们先来看看某网友的诉苦:“我的是台...
- 设计字体那些事(设计字体种类大全图)
-
做设计几年,平均每年都能遇见好多因为字体侵权的事情,今天就结合我自己的经验和了解简单介绍下字体那些事#毒角SHOW角角用了这款字体,竟被送律师函赔偿10万https://www.douyin.com...
- LCD智能显示模块-绘图板(lcd显示模块流程图)
-
TOPWAY智能模块(SmartLCD)是专门为工业显示应用而设计的TFT液晶显示模块。我司自主研发的界面编辑软件RGTools/SGTools提供了18个控件,通过些控件能实现丰富的显...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML常用标签 (29)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- HTML button formtarget 属性 (30)
- CSS 水平对齐 (Horizontal Align) (30)