滴滴实习一面:浏览器缓存机制

这是之前一个27同学面滴滴实习的题目,部门是体验平台,针对浏览器缓存问了强弱缓存区别以及使用场景等问题,小圆这边整理好了~

浏览器缓存是前端性能优化中最重要的一环。合理利用缓存,不仅能显著提升页面加载速度、减少服务器压力,还能改善用户体验。但在面试中,很多人只会“Cache-Control、ETag、Expires”这几个名词,却说不清底层逻辑与交互过程。本文讲解浏览器缓存机制,从类型、原理到实践配置,帮你彻底吃透这个高频考点。 

一、缓存的分类概览

浏览器缓存大体分为两类:

类型

是否向服务器发请求

命中后资源来源

常用字段

强缓存(Strong Cache)

本地缓存(Memory/Disk)

Cache-Control

Expires

协商缓存(Negotiated Cache)

服务器返回304,浏览器使用本地缓存

ETag/If-None-Match

Last-Modified/If-Modified-Since

二者的关系可以概括为:强缓存优先,未命中后再进入协商缓存。

二、强缓存机制详解

1. 触发时机

当浏览器请求某个资源时,会先检查本地缓存是否可用(即强缓存是否命中)。

2. 核心字段

(1)Cache-Control

现代浏览器主推的缓存控制头,它的优先级高于 Expires。常见取值如下:

指令

含义

max-age=600

资源在600秒内有效

no-cache

强缓存失效,强制进入协商缓存

no-store

禁止缓存任何内容

public

所有人都可以缓存(CDN、中间代理)

private

仅客户端可缓存,代理服务器不能缓存

(2)Expires

HTTP/1.0 时代的产物,通过绝对时间控制缓存失效,如:

Expires: Wed, 22 Oct 2025 12:00:00 GMT

缺点是依赖客户端时间,易受系统时间差影响。

3. 强缓存的优先级判定

浏览器判断逻辑如下:

if (Cache-Control 存在) → 使用 Cache-Control
else if (Expires 存在) → 使用 Expires
else → 不使用强缓存

四、协商缓存机制详解

当强缓存失效后,浏览器会携带部分资源标识向服务器发起请求,询问资源是否更新。若服务器确认资源未变更,则返回 304 Not Modified,浏览器直接使用本地缓存副本。

1. 核心字段

(1)Last-Modified / If-Modified-Since

  • 服务器首次响应
Last-Modified: Wed, 22 Oct 2025 10:00:00 GMT
  • 浏览器下一次请求时
If-Modified-Since: Wed, 22 Oct 2025 10:00:00 GMT

若服务器判断文件无更新,则返回 304

缺点

  • 时间精度以秒为单位,若文件在一秒内被多次修改,可能检测不到更新。
  • 一些文件周期性重新生成,即使内容相同,时间不同也会触发重新下载。

(2)ETag / If-None-Match

ETag 是资源内容的唯一标识(通常是哈希值)。

  • 服务器首次响应
ETag: "filehash-12345"
  • 浏览器下一次请求时
If-None-Match: "filehash-12345"

若 ETag 一致,则返回 304

优点:精度更高,不依赖时间。缺点:计算 ETag 会增加服务器负担。

一般做法:两组字段(ETag / Last-Modified)常同时使用,保证兼容性与准确性。

五、缓存的整体流程

浏览器加载资源时的完整判断流程如下:

  1. 检查强缓存(Cache-ControlExpires
  2. 发起请求携带验证字段(If-Modified-Since 或 If-None-Match)。
  3. 服务器判断资源是否变动:

六、缓存位置与生命周期

缓存可存在多个层次:

位置

特点

Memory Cache

存在内存中,关闭标签页即失效

Disk Cache

存储于硬盘,可长期存在

Service Worker Cache

可自定义缓存逻辑,离线可用

Push Cache(HTTP/2)

仅连接生命周期内有效

浏览器通常会根据资源类型与大小选择合适的存储位置。

七、实际项目中的应用策略

1. 静态资源(JS/CSS/图片)

  • 使用文件指纹(hash)解决更新问题;
  • 设置长时间缓存:
Cache-Control: max-age=31536000, immutable
  • 文件变更时文件名变化,浏览器自动拉取新版本。

2. 接口请求(API)

  • 频繁变化 → 使用 no-cache 或 no-store
  • GET 接口若数据稳定,可考虑 ETag 提升性能。

3. HTML 页面

  • 通常设置为 no-cache
  • 通过版本号或构建标识控制更新。

总结

前端常用的缓存方案一般采用强缓存与协商缓存相结合的方式,具体是:

1. HTML文档配置协商缓存

2. JS、CSS、图片等资源配置强缓存

这样当项目版本更新时,可以获取最新的页面;若版本未更新,则可以继续复用之前的缓存

八、前端开发者常见误区

  1. 误区1:no-cache 就是不缓存实际上,它只是强缓存失效,仍可能走协商缓存。
  2. 误区2:ETag 与 Last-Modified 互斥它们可以并存,服务器优先验证 ETag,再验证时间。
  3. 误区3:缓存设置全交给后端前端在构建环节(Webpack/Vite)也能配置静态资源 hash 与缓存策略。

总结

浏览器缓存机制是 Web 性能优化的基石。可以用一句话总结它的核心逻辑:先看强缓存(Cache-Control、Expires),再看协商缓存(ETag、Last-Modified)。命中即本地读取,未命中则询问服务器是否更新。

面试时若能把流程、字段、优缺点等等讲清楚,并结合项目实践(比如资源指纹 + CDN 缓存策略),可以给面试官留下好印象哦。

#前端八股文##面试##日常实习##前端##秋招#
全部评论

相关推荐

2025-12-08 09:20
门头沟学院 Java
1.项目介绍2.分布式系统中的幂等性问题在设计一个电商系统的订单支付接口时,如何保证幂等性,防止重复支付?3.消息队列的消息积压处理若Kafka消息队列出现大量消息积压,你会从哪些方面排查原因?请详细说明对应的解决方案。4.微服务接口的熔断降级设计在基于SpringCloud的微服务架构中,如何设计一个依赖外部第三方服务的接口的熔断降级策略,确保系统高可用?5.Redis 缓存雪崩应对当Redis缓存发生雪崩:导致大量请求直接打到数据库,如何快速恢复系统并预防此类问题再次发生?6.数据库分库分表后的事务处理在电商系统数据库分库分表后,跨库的订单创建与库存扣减操作,怎样保证事务的一致性?7.JVM垃圾回收器的选择与调优针对不同的业务场景,如何选择合适的JVM垃圾回收器?8.高并发下的接口限流实现在秒杀活动场景中,如何基于Guava的 RateLimiter或Sentinel实现接口限流,避免系统被流量击垮?9.Java线程池的动态调整在一个实时日志处理系统中,如何根据任务队列长度和系统负载动态调整线程池的核心线程数与最大线程数?10.Spring Boot 应用的启动性能优化对于一个包含大量自动配置和第三方依赖的SpringBoot应用,怎样优化其启动时间?11.分布式系统中的全局唯一ID生成在分布式订单系统中,如何设计一个高效且全局唯一的订单 ID生成方案?12.JVM内存碎片的分析与解决当Java应用频繁出现FullGC且存在内存碎片问题,如何利用工具定位并解决?13.分布式锁的性能优化使用Redis实现分布式锁时,如何提高锁的获取和释放效率,减少线程等待时间?14.MySQL慢查询优化实战在项目中发现一条执行缓慢的SOL语句,你会通过哪些步骤和方法进行优化?15.Spring事务失效场景分析在Spring项目中,哪些情况会导致事务注解@Transactional失效?如何排查和解决?16.Kafka消息重复消费处理在使用Kafka作为消息队列时,若出现消息重复消费该如何设计解决方案?17.分布式系统中的服务注册与发现基于Nacos实现服务注册与发现,如何保证服务实例的健康检查准确性和高可用性?18.Java对象的序列化与反序列化在分布式RPC调用中,为什么需要对象序列化?常见的序列化框架有哪些,如何选择?19.数据库读写分离的实现与问题在电商系统中实现MySOL读写分离后,可能会遇到哪些数据一致性问题?如何解决?
查看18道真题和解析
点赞 评论 收藏
分享
2025-12-08 08:10
门头沟学院 Java
1.项目介绍2.高铁票抢票系统如何设计支持每秒10万+请求的高铁票抢票系统,确保库存准确且响应延迟<500ms?3.酒店价格实时同步多渠道(携程/飞猪/美团)售卖同一酒店房源时,如何保证价格实时同步,避免价差纠纷?4.航班动态推送如何向100万+在线用户实时推送航班延误信息,支持按航线和用户等级优先推送?5.旅游订单分库分表携程年订单量超10亿,如何设计分库分表方案,支持按用户ID、订单时间、目的地多维度查询?6.缓存穿透防护用户高频查询不存在的酒店ID(如恶意攻击),如何设计防护机制,避免击垮数据库?7.支付超时处理用户支付超时未完成,如何高效回收订单库存并通知用户?8.分布式事务处理用户下单后,需同时扣减酒店库存、创建支付单、发送短信通知,如何保证三个操作的原子性?(SeataTCC模式+最终一致性9.搜索推荐优化用户输入"三亚 亲子酒店"时,如何在300ms内返回精准结果,包含价格、评分、库存状态?10.秒杀活动设计节假日酒店秒杀活动,如何支撑每秒5万次下单请求,防止超卖和系统崩溃?11.JVM内存优化携程APP首页服务频繁OOM,堆内存占用持续攀升,如何通过内存分析和参数调优解决?12.分布式锁实现多服务实例并发修改同一酒店房价,如何保证价格更新的准确性?13.日志检索平台如何设计日均10TB的业务日志检索平台,支持按订单号、用户ID快速定位问题?14.缓存一致性酒店库存信息在MySQL和Redis中如何保持一致,避免用户看到的库存与实际不符?15.服务熔断降级机票查询依赖第三方航司API,当API响应延迟超3秒时,如何设计熔断策略保证核心功能可用?16.地理位置检索如何实现"附近5公里内评分4.5以上的酒店"功能,支持高并发查询?17.分布式ID生成携程订单号如何设计,既能保证全局唯一,又能包含时间、业务线等信息?18.数据迁移方案如何将10亿条历史订单从MySQL平滑迁移到ClickHouse,迁移过程不影响线上查询?19.高可用架构核心预订服务如何设计多活架构,保证单机房故障时业务不中断?
点赞 评论 收藏
分享
评论
4
11
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务