
1) 【一句话结论】
根据数据访问模式(高频/低频、时效性),采用“浏览器内存缓存(LRU)+ 服务端缓存(TTL+LRU)+ 本地存储(IndexedDB)”的三层缓存架构,平衡性能与内存占用。
2) 【原理/概念讲解】
首先明确缓存位置的三层逻辑:
然后解释核心策略:
3) 【对比与适用场景】
| 缓存位置 | 缓存策略 | 定义 | 特性 | 适用场景 | 注意点 |
|---|---|---|---|---|---|
| 浏览器内存缓存 | LRU | 内存中缓存,按访问时间排序,淘汰最近最少使用的 | 速度快(CPU缓存级),容量小(5-10MB) | 高频、小数据量(如用户个人信息、组件状态) | 需实现LRU算法(链表+哈希表) |
| 服务端缓存 | TTL+LRU | 服务端(如Redis)缓存,结合时间过期和访问频率 | 速度快(网络延迟低),容量大(GB级) | 中频、大数据量(如商品列表、用户数据) | 需合理设置TTL(避免频繁请求/数据过时) |
| 本地存储 | TTL+容量限制 | 浏览器本地存储(IndexedDB) | 读写慢(磁盘I/O),容量大(GB级) | 离线、大文件(如图片、视频、离线包) | 适合不频繁访问的数据,需注意读写性能 |
4) 【示例】
假设前端组件需获取“用户个人信息”,流程如下:
/api/user/info获取数据,返回后更新内存缓存和服务端缓存(Redis TTL=5分钟)。伪代码示例:
async function getUserInfo() {
// 1. 检查内存缓存(LRU)
const cached = memoryCache.get('user_info');
if (cached) return cached;
// 2. 检查服务端缓存(TTL)
const serverCached = await redis.get('user_info');
if (serverCached) {
memoryCache.set('user_info', serverCached);
return serverCached;
}
// 3. 请求后端API
const data = await fetch('/api/user/info');
const result = await data.json();
// 4. 更新缓存
memoryCache.set('user_info', result);
redis.set('user_info', result, { EX: 300 }); // TTL=5分钟
return result;
}
5) 【面试口播版答案】
“面试官您好,针对前端组件缓存策略,我的核心思路是采用分层缓存架构来平衡性能与内存占用。具体来说,我会根据数据的访问频率和时效性,选择不同的缓存位置和策略:
首先,高频、短时效的数据(如用户个人信息、组件状态)优先使用浏览器内存缓存,采用LRU策略,因为内存缓存访问速度快,能快速响应高频请求,同时LRU能自动淘汰最近最少使用的数据,避免内存溢出;
其次,中频、长时效的数据(如商品列表、用户数据)使用服务端缓存(如Redis),结合TTL和LRU策略,服务端缓存容量大,能存储更多数据,TTL控制数据的有效期,避免缓存数据过时,而LRU则优化了访问性能;
最后,离线、大文件或需要持久化存储的数据(如图片、视频、离线包),使用浏览器本地存储(如IndexedDB),通过TTL和容量限制管理,虽然读写速度较慢,但能保证离线场景下的数据可用性。
总结来说,这种分层策略能根据数据特性动态分配缓存资源,既保证了高频请求的性能,又控制了内存占用,同时兼顾了离线场景的需求。”
6) 【追问清单】
7) 【常见坑/雷区】