
1) 【一句话结论】移动客户端缓存需基于设备内存与访问模式动态配置:图片缓存采用LRU+WebP压缩+懒加载,数据缓存结合LRU/LFU+时间戳,通过访问日志与缓存过期机制平衡命中率与内存,避免OOM或数据不一致。
2) 【原理/概念讲解】缓存的核心目标是提升数据访问速度、减少网络请求,但需权衡内存占用。缓存命中率指缓存中能直接满足请求的比例;淘汰机制是缓存满时决定移除哪些数据。
3) 【对比与适用场景】
| 特性 | LRU(最近最少使用) | LFU(最不经常使用) |
|---|---|---|
| 定义 | 淘汰最近最久未使用的数据 | 淘汰被访问次数最少的(频率最低)的数据 |
| 特性 | 简单,基于时间,时间复杂度O(1)操作 | 基于频率统计,时间复杂度O(1)但需维护计数器 |
| 使用场景 | 图片缓存(高频访问,频率差异小)、用户信息缓存 | 冷数据(如用户设置、历史记录,偶尔访问) |
| 注意点 | 可能误淘汰近期高频数据(如刚打开的页面) | 初始阶段数据访问频率未稳定,可能导致错误淘汰 |
4) 【示例】
假设设备内存1GB,图片缓存200MB(占20%),数据缓存100MB(占10%)。
public class ImageCache {
private final int maxSize; // 单位:MB
private final LruCache<String, Bitmap> lruCache;
public ImageCache(int maxSize) {
this.maxSize = maxSize;
this.lruCache = new LruCache<>(maxSize);
}
public Bitmap get(String url) {
return lruCache.get(url);
}
public void put(String url, Bitmap bitmap) {
lruCache.put(url, bitmap);
}
public void loadIfNeeded(String url, View view) {
Bitmap bitmap = get(url);
if (bitmap == null) {
new ImageLoader(url, bitmap, view).execute();
} else {
view.setImageBitmap(bitmap);
}
}
}
5) 【面试口播版答案】(约90秒)
“面试官您好,针对图片缓存和数据缓存平衡的问题,我的核心思路是分层动态适配。图片缓存因内存敏感,采用LRU+WebP压缩+懒加载,比如用户打开动态列表时,图片初始显示占位符,滚动进入可视区域才加载,避免初始内存爆炸;数据缓存(用户信息、动态列表)根据访问模式调整:高频热点数据用LRU,冷数据用LFU,同时结合时间戳淘汰。比如用户信息频繁访问(头像显示),动态列表按时间倒序加载,较旧动态被淘汰。缓存大小根据设备内存(1GB手机,图片缓存200MB,数据缓存100MB)和访问日志(统计访问频率、时间戳)动态调整,热点数据优先保留,冷数据更激进淘汰,确保缓存命中率80%左右,内存占用合理。”
6) 【追问清单】
7) 【常见坑/雷区】