网络学习(11) |深入解析客户端缓存与服务器缓存:HTTP缓存控制头字段及优化实践
文章目录
- 客户端缓存与服务器缓存的区别
- 客户端缓存
- 浏览器缓存
- 应用程序缓存
- 优点
- 缺点
- 服务器缓存
- 优点
- 缺点
- HTTP缓存控制头字段
- Cache-Control
- Expires
- Last-Modified
- ETag
- 缓存策略的优化与实践经验分享
- 1. 使用合适的缓存头字段
- 2. 结合使用Last-Modified和ETag
- 3. 利用CDN进行缓存
- 4. 实现缓存失效机制
- 5. 缓存预热
- 6. 监控与调优
- 7. 避免缓存雪崩
客户端缓存与服务器缓存的区别
客户端缓存
客户端缓存是指将数据存储在用户的设备上,以减少网络请求的频率和提高应用性能。常见的客户端缓存包括浏览器缓存和应用程序缓存。
浏览器缓存
浏览器缓存是指浏览器将网站的数据(如HTML、CSS、JavaScript、图片等)存储在本地磁盘或内存中,以便在用户再次访问时能快速加载这些资源,而不需要重新从服务器获取。
应用程序缓存
应用程序缓存是指将数据存储在客户端应用程序的本地存储中,以减少网络请求的频率和提高应用性能。常见的应用程序缓存技术包括本地存储(如HTML5的LocalStorage和SessionStorage)、IndexDB,以及移动应用中的本地数据库(如SQLite)。
优点
- 减少服务器负载:减少了对服务器的请求次数,从而减轻了服务器的压力。
- 提高加载速度:从本地缓存加载资源要比从服务器获取快得多,从而提升用户体验。
缺点
- 数据可能过时:客户端缓存的数据可能与服务器上的最新数据不一致,导致用户看到的内容不是最新的。
- 存储空间有限:客户端设备的存储空间是有限的,尤其是在移动设备上。
- 安全性风险:本地存储的数据可能面临安全风险,如果没有适当的加密和保护措施,敏感数据可能会被恶意软件或用户窃取。
通过合理利用客户端缓存,可以显著提升应用的性能和用户体验,但同时需要注意数据一致性和安全性问题。结合具体应用场景,选择合适的缓存技术和策略,才能实现最佳效果。
服务器缓存
服务器缓存是指将数据存储在服务器端的缓存系统中,以减少对数据库或其他后端服务的访问频率,从而提高系统性能。常见的服务器缓存包括内存缓存(如Redis、Memcached)和文件缓存。
优点
- 减少数据库负载:通过缓存数据库查询结果,减少了对数据库的访问频率,从而减轻数据库的压力。
- 提高响应速度:从缓存中读取数据要比从数据库中读取快得多,从而提高了服务器的响应速度。
缺点
- 缓存一致性问题:缓存中的数据可能与数据库中的数据不一致,需要采取适当的缓存失效机制来确保数据一致性。
- 额外的维护成本:需要设计和维护缓存系统,增加了系统的复杂度。
HTTP缓存控制头字段
HTTP协议提供了一些头字段来控制缓存行为,常见的包括Cache-Control
、Expires
、Last-Modified
和ETag
。
Cache-Control
Cache-Control
头字段用于指定请求和响应的缓存机制。它可以包含多个指令,常见的指令包括:
- public:表示响应可以被任何缓存(包括浏览器、CDN等)存储。
- private:表示响应只能被单个用户的浏览器缓存存储,不能被共享缓存存储。
- no-cache:强制缓存进行重新验证,即使缓存副本是新鲜的。
- no-store:禁止任何缓存存储响应数据,每次请求都必须从服务器获取。
- max-age=:指定响应可以被缓存的最大时间,以秒为单位。
例如:
Cache-Control: public, max-age=3600
表示响应可以被任何缓存存储,并且缓存的有效期为3600秒(1小时)。
Expires
Expires
头字段指定响应过期的日期和时间,格式为HTTP日期。它用于指示缓存何时认为响应是陈旧的。
例如:
Expires: Wed, 21 Oct 2024 07:28:00 GMT
表示响应在2024年10月21日7点28分后过期。
需要注意的是,如果同时存在Cache-Control
和Expires
头字段,Cache-Control
优先级更高。
Last-Modified
Last-Modified
头字段指示资源的最后修改时间。服务器可以在响应中包含这个头字段,客户端在后续请求中可以使用If-Modified-Since
头字段来询问服务器资源是否在某个时间点之后修改过。
例如:
Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT
客户端请求时可以包含:
If-Modified-Since: Wed, 21 Oct 2023 07:28:00 GMT
如果资源自该时间点之后未修改,服务器可以返回304 Not Modified响应,指示客户端使用缓存数据。
ETag
ETag
(实体标签)是资源的标识符,通常是资源内容的哈希值。服务器在响应中包含这个头字段,客户端在后续请求中可以使用If-None-Match
头字段来询问服务器资源是否发生变化。
例如:
ETag: "686897696a7c876b7e"
客户端请求时可以包含:
If-None-Match: "686897696a7c876b7e"
如果资源未变化,服务器返回304 Not Modified响应。
缓存策略的优化与实践经验分享
1. 使用合适的缓存头字段
在实际项目中,根据资源的不同特点选择合适的缓存头字段。例如,对于不经常变化的静态资源(如图片、CSS、JavaScript文件),可以设置较长的max-age
和public
指令。而对于动态内容,可能需要设置no-cache
或较短的max-age
。
2. 结合使用Last-Modified和ETag
Last-Modified
和ETag
可以结合使用,以确保缓存的有效性。通过这两个头字段,服务器可以准确判断资源是否发生了变化,从而避免不必要的数据传输。
3. 利用CDN进行缓存
使用内容分发网络(CDN)可以显著提高资源加载速度和减少服务器负载。CDN会将资源缓存到离用户最近的节点,减少了网络延迟。配置CDN时,可以结合使用Cache-Control
头字段,以控制CDN的缓存行为。
4. 实现缓存失效机制
为了确保缓存数据的准确性,需要设计合理的缓存失效机制。例如,可以在资源更新时主动使相关缓存失效,或者设置合理的缓存过期时间。对于服务器缓存,可以使用如Redis的expire
命令设置缓存的过期时间。
5. 缓存预热
在系统启动或发布新版本时,可以预先加载一些常用数据到缓存中,这样在用户首次访问时就能直接从缓存中获取数据,提高响应速度。
6. 监控与调优
定期监控缓存的命中率和性能,分析缓存策略的效果,并根据实际情况进行调整。可以通过日志和监控工具,了解缓存的使用情况和命中率,以便及时发现问题和优化缓存策略。
7. 避免缓存雪崩
缓存雪崩是指大量缓存同时失效,导致大量请求直接打到数据库或后端服务,造成系统压力剧增。可以通过设置不同的缓存过期时间,避免大量缓存同时失效。
通过合理的缓存策略,可以显著提升系统性能,降低服务器负载,并改善用户体验。在实践中,需要结合具体项目的特点,灵活运用各种缓存技术和策略,才能实现最佳效果。
相关文章:
网络学习(11) |深入解析客户端缓存与服务器缓存:HTTP缓存控制头字段及优化实践
文章目录 客户端缓存与服务器缓存的区别客户端缓存浏览器缓存应用程序缓存优点缺点 服务器缓存优点缺点 HTTP缓存控制头字段Cache-ControlExpiresLast-ModifiedETag 缓存策略的优化与实践经验分享1. 使用合适的缓存头字段2. 结合使用Last-Modified和ETag3. 利用CDN进行缓存4. 实…...
uniapp中二次封装jssdk和使用
直接上代码 // import wx from "weixin-js-sdk"; /*** 考虑到包的大小,所以直接在 index.html 文件中cdn引入了jssdk* <script src"https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>* 注意:这里 jWeixin 一…...

只刷题可以通过PMP考试吗?
咱们都知道,PMBOK那本书,哎呀,读起来确实有点费劲。所以,有些人就想了,干脆我就刷题吧,题海战术,没准儿也能过。这话啊,听起来似乎有点道理,但咱们得好好琢磨琢磨。 刷题…...

Python Selenium 详解:实现高效的UI自动化测试
落日余辉,深情不及久伴。大家好,在当今软件开发的世界中,自动化测试已经成为保障软件质量和快速迭代的重要环节。而在自动化测试的领域中,UI自动化测试是不可或缺的一部分,它可以帮助测试团队快速验证用户界面的正确性…...
npm获取yarn在安装依赖时 git://github.com/user/xx.git 无法访问解决方法 -- 使用 insteadOf设置git命令别名
今天在使用一个node项目时突然遇到 一个github的拉取异常,一看协议居然是git://xxx 貌似github早就不用这种格式了, 而是使用的gitgithub.com:xxx 这种或者https协议,解决方法: 使用insteadof设置git别名 url.<base>.inste…...

Centos7网络故障,开机之后连不上网ens33mtu 1500 qdisc noop state DOWN group default qlen 1000
说明 这是Linux系统网络接口的信息,其中"mtu 1500"表示最大传输单元大小为1500字节,“qdisc noop”表示没有设置特殊的队列算法,“state down”表示该接口当前处于关闭状态,“group default”表示该接口属于“default”…...
分析 Base64 编码和 URL 安全 Base64 编码
前言 在处理数据传输和存储时,Base64 编码是一种非常常见的技术。它可以将二进制数据转换为文本格式,便于在文本环境中传输和处理。Go 语言提供了对标准 Base64 编码和 URL 安全 Base64 编码的支持。本文将通过一个示例代码,来分析这两种编码…...
cocos 屏幕点击坐标转换为节点坐标
let scPos event.getLocation(); let camera find(Canvas/Camera).getComponent(Camera).screenToWorld(new Vec3(scPos.x,scPos.y,0));//摄像机 let p this.node.getComponent(UITransform).convertToNodeSpaceAR(camera);//this.node为指定的节点为原点(0,0&…...

电瓶车进电梯识别报警摄像机
随着电动车的普及,越来越多的人选择电动车作为出行工具。在诸多场景中,电梯作为一种常见的交通工具,也受到了电动车用户的青睐。然而,电动车进入电梯时存在一些安全隐患,为了提高电动车进电梯的安全性,可以…...
数据库到服务器提权
数据库提权流程: 1、先获取到数据库用户密码 -网站存在SQL注入漏洞 -数据库的存储文件或备份文件 -网站应用源码中的数据库配置文件 -采用工具或脚本爆破(需解决外联问题) 2、利用数据库提权项目进行连接 MDUT //jkd1.8 启动 Databasetools …...
【MySQL精通之路】InnoDB(9)-表和页压缩(1)-表压缩
目录 1.表压缩概述 2.创建压缩表 2.1 在FPT表空间中创建压缩表 2.2 在通用表空间中创建压缩表 2.3 压缩表的限制 3.优化InnoDB表的压缩 4.运行时监控InnoDB表压缩 5.InnoDB表的压缩工作原理 5.1 压缩算法 5.2 InnoDB数据存储和压缩 5.3 B树页面的压缩 5.4 压缩BLOB、…...
【前端】vue+element项目中select下拉框label想要显示多个值多个字段
Vue Element项目中select下拉框label想要显示多个值 <el-selectv-model"form.plantId"collapse-tagsfilterableplaceholder"请选择品种种类"style"width: 270px;"><el-optionv-for"item in plantIdArray":key"item.id&…...

橙派探险记:开箱香橙派 AIpro 与疲劳驾驶检测的奇幻之旅
目录 引子:神秘包裹的到来 第一章:香橙派AIpro初体验 资源与性能介绍 系统烧录 Linux 镜像(TF 卡) 调试模式 登录模式 第二章:大胆的项目构想 系统架构设计 香橙派 AIpro 在项目中的重要作用 第三章…...

云计算期末复习(1)
云计算基础 作业(问答题) (1)总结云计算的特点。 透明的云端计算服务 “无限”多的计算资源,提供强大的计算能力 按需分配,弹性伸缩,取用方便,成本低廉资源共享,降低企…...
frp转发服务
将内网服务转发到外网,我准备了一台阿里云ubuntu22.04服务器,两台内网ubuntu22.04服务器 下载frpc和frps以及配置文件 链接: https://pan.baidu.com/s/1auvcWWnyfpYPYatYhHFYag?pwdqkgh 提取码: qkgh 复制这段内容后打开百度网盘手机App,操作…...

【主流分布式算法总结】
文章目录 分布式常见的问题常见的分布式算法Raft算法概念Raft的实现 ZAB算法Paxos算法 分布式常见的问题 分布式场景下困扰我们的3个核心问题(CAP):一致性、可用性、分区容错性。 1、一致性(Consistency):…...

spring cloud config server源码学习(一)
文章目录 1. 注解EnableConfigServer2. ConfigServerAutoConfiguration2.1 ConditionalOnBean和ConditionalOnProperty2.2 Import注解2.2.1. EnvironmentRepositoryConfiguration.class2.2.2. CompositeConfiguration.class2.2.3. ResourceRepositoryConfiguration.class2.2.4.…...

人脸识别——探索戴口罩对人脸识别算法的影响
1. 概述 人脸识别是一种机器学习技术,广泛应用于各种领域,包括出入境管制、电子设备安全登录、社区监控、学校考勤管理、工作场所考勤管理和刑事调查。然而,当 COVID-19 引发全球大流行时,戴口罩就成了日常生活中的必需品。广泛使…...

磁盘管理后续——盘符漂移问题解决
之前格式化磁盘安装了文件系统,且对磁盘做了相应的挂载,但是服务器重启后挂载信息可能有问题,或者出现盘符漂移、盘符变化、盘符错乱等故障,具体是dev/sda, sdb, sdc 等等在某些情况下会混乱掉 比如sda变成了sdb或者sdc变成了sdb等…...

基于GO 写的一款 GUI 工具,M3u8视频下载播放器-飞鸟视频助手
M3u8视频下载播放器-飞鸟视频助手 M3u8视频飞鸟视频助手使用m3u8下载m3u8 本地播放 软件下载地址m3u8嗅探 M3u8视频 M3u8视频格式是为网络视频播放设计,视频网站多数采用 m3u8格式。如腾讯,爱奇艺等网站。 m3u8和 mp4的区别: 一个 mp4是一个…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...