51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

在移动端开发中,如何设计网络请求的缓存策略?请结合不同场景(如静态资源、动态数据)说明缓存策略的选择,以及如何处理缓存更新和失效。

Tencent软件开发-移动客户端开发方向难度:中等

答案

1) 【一句话结论】移动端网络请求缓存需分资源类型(静态/动态),静态资源采用强缓存(Expires/Cache-Control max-age)+协商缓存(ETag/Last-Modified),动态数据采用弱缓存(如LRU/TTL),并配合缓存更新(版本号/时间戳)和失效(TTL过期/强制更新)机制,平衡加载效率与数据实时性。

2) 【原理/概念讲解】老师口吻:缓存策略的核心是“缓存控制头”和“缓存状态”。

  • 强缓存:通过 Cache-Control: max-age=3600(客户端缓存时间)或 Expires(过期时间)控制,客户端在指定时间内无需请求服务器,直接使用缓存(类比:图书馆借阅的书籍,可长期从本地“借阅记录”获取,无需每次都去书店)。
  • 协商缓存:通过 ETag(资源唯一标识)或 Last-Modified(最后修改时间)控制,客户端请求时携带标识,服务器判断是否更新,若未更新返回 304 Not Modified(仍用缓存),否则返回新数据并更新缓存(类比:用户查询书籍是否更新,若未更新则告知“无需再查”,继续用旧书)。
  • 缓存失效:通过 Cache-Control: no-cache(需验证)、no-store(不缓存)或 max-age=0(立即失效)实现,确保数据强制更新(如用户登录后,用户信息需立即更新)。

3) 【对比与适用场景】

策略类型控制头缓存行为使用场景注意点
强缓存Cache-Control: max-age/Expires客户端直接用缓存,无需请求服务器静态资源(图片、JS、CSS)、不常变配置需合理设置时间,避免过期后频繁请求
协商缓存ETag/Last-Modified请求时携带标识,服务器判断是否更新静态/动态资源(如用户列表,需判断是否修改)需服务器返回正确标识,否则缓存失效
弱缓存(动态数据)Cache-Control: max-age=300(短时间)/no-cache缓存时间短,或需验证动态数据(用户信息、订单状态)、实时性要求高的数据需合理设置TTL,避免数据过时或频繁请求
缓存失效Cache-Control: no-cache/no-store/max-age=0强制缓存失效,每次请求都去服务器需强制更新(如用户登录后,用户信息更新)需明确失效条件,避免缓存污染

4) 【示例】

  • 静态资源请求:
    HTTP请求头:Cache-Control: max-age=86400(1天),Expires: 2023-12-01T...。
    客户端缓存图片,下次请求若缓存未过期,直接使用;若过期,发送 If-None-Match: "abc",服务器返回 304 Not Modified,客户端继续用缓存。
  • 动态数据请求:
    缓存TTL=5分钟,若用户登录后,服务器返回新数据(如用户列表更新),客户端更新缓存;下次请求若未过期,直接返回缓存数据;若过期,发送 If-Modified-Since: "2023-11-...",服务器判断是否更新,若未更新返回 304,否则返回新数据并更新缓存。

5) 【面试口播版答案】
在移动端开发中,网络请求缓存策略需根据资源类型(静态/动态)区分。对于静态资源(如图片、JS、CSS),采用强缓存(Cache-Control: max-age=1天)+协商缓存(ETag),客户端可长期使用缓存,减少服务器压力;对于动态数据(如用户列表、订单状态),采用弱缓存(如TTL=5分钟),并配合条件请求(If-Modified-Since),避免数据过时。缓存更新时,通过版本号(如V=1.0)或时间戳标识,服务器数据更新时客户端更新缓存;缓存失效则通过TTL过期或强制更新(如用户登录后,设置Cache-Control: no-cache,强制请求服务器)。这样既能保证加载速度,又能确保数据实时性。

6) 【追问清单】

  • 问题:如何处理缓存更新时的并发问题(如多用户同时更新缓存导致数据不一致)?
    回答:使用分布式锁(如Redis分布式锁)或版本号机制,确保同一时间只有一个用户更新缓存。
  • 问题:缓存穿透的解决方案是什么?
    回答:使用布隆过滤器过滤无效请求,或设置空缓存(返回默认值)并设置过期时间(如1分钟),避免缓存穿透。
  • 问题:离线缓存(如Service Worker)如何结合网络请求缓存?
    回答:Service Worker可缓存静态资源,实现离线加载;动态数据通过HTTP缓存(如条件请求)与离线缓存结合,确保离线时使用缓存数据。
  • 问题:如何平衡缓存大小与性能?
    回答:使用LRU(最近最少使用)算法管理缓存,定期清理过期或低频访问的缓存数据,避免内存占用过高。
  • 问题:缓存失效策略中,TTL与指定时间(如max-age)的区别?
    回答:TTL是缓存过期时间,指定时间后缓存失效;而max-age是客户端缓存时间,若未过期则直接使用,过期则重新请求。

7) 【常见坑/雷区】

  • 混淆强缓存与协商缓存:错误地认为所有资源都使用强缓存,导致动态数据过时。
  • 动态数据用强缓存:设置过长的max-age,导致用户数据(如订单状态)长时间未更新,影响用户体验。
  • 缓存失效时未正确处理:未设置Cache-Control: no-cache或max-age=0,导致缓存一直有效,数据无法更新。
  • 忽略网络环境:未使用Service Worker实现离线缓存,导致用户离线时无法使用应用。
  • 缓存更新时的并发问题:未使用锁机制,导致多用户同时更新缓存时数据不一致(如用户列表重复或数据丢失)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1