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

移动客户端中,图片缓存和数据缓存(如用户信息、动态列表)需要平衡缓存命中率和内存占用。请设计一个缓存策略,说明如何选择缓存类型(如LRU、LFU)、缓存淘汰机制,以及如何根据数据访问模式(如热点数据、冷数据)调整缓存策略。请举例说明如何处理图片的内存占用问题(如图片压缩、懒加载)。

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

答案

1) 【一句话结论】移动客户端缓存需基于设备内存与访问模式动态配置:图片缓存采用LRU+WebP压缩+懒加载,数据缓存结合LRU/LFU+时间戳,通过访问日志与缓存过期机制平衡命中率与内存,避免OOM或数据不一致。

2) 【原理/概念讲解】缓存的核心目标是提升数据访问速度、减少网络请求,但需权衡内存占用。缓存命中率指缓存中能直接满足请求的比例;淘汰机制是缓存满时决定移除哪些数据。

  • LRU(最近最少使用):淘汰最近最久未使用的数据,实现简单,基于时间戳(记录数据最后访问时间),适合大多数场景(类比图书馆:最近没借过的书被淘汰)。
  • LFU(最不经常使用):淘汰被访问次数最少的(频率最低)数据,基于访问频率统计,适合数据访问频率差异大的场景(类比图书馆:借的次数最少的书被淘汰)。
  • 热点数据/冷数据:热点数据是高频访问(如用户头像、常用动态),冷数据是低频(如用户设置、历史记录),需针对性调整缓存策略。

3) 【对比与适用场景】

特性LRU(最近最少使用)LFU(最不经常使用)
定义淘汰最近最久未使用的数据淘汰被访问次数最少的(频率最低)的数据
特性简单,基于时间,时间复杂度O(1)操作基于频率统计,时间复杂度O(1)但需维护计数器
使用场景图片缓存(高频访问,频率差异小)、用户信息缓存冷数据(如用户设置、历史记录,偶尔访问)
注意点可能误淘汰近期高频数据(如刚打开的页面)初始阶段数据访问频率未稳定,可能导致错误淘汰

4) 【示例】
假设设备内存1GB,图片缓存200MB(占20%),数据缓存100MB(占10%)。

  • 图片缓存:LRU策略+WebP压缩(比JPEG小30%以上)+懒加载(图片进入屏幕可视区域触发加载)。例如,用户打开动态列表时,图片初始显示占位符,滚动进入可视区域才触发网络请求,加载后缓存到LRU图片缓存。
    伪代码(图片缓存):
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);
        }
    }
}
  • 数据缓存:用户信息(高频访问)用LRU,动态列表(按时间倒序加载)用LRU+时间戳(过期5分钟),服务器更新时通过观察者模式刷新。例如,用户信息被频繁访问(头像显示),动态列表较旧数据被淘汰。

5) 【面试口播版答案】(约90秒)
“面试官您好,针对图片缓存和数据缓存平衡的问题,我的核心思路是分层动态适配。图片缓存因内存敏感,采用LRU+WebP压缩+懒加载,比如用户打开动态列表时,图片初始显示占位符,滚动进入可视区域才加载,避免初始内存爆炸;数据缓存(用户信息、动态列表)根据访问模式调整:高频热点数据用LRU,冷数据用LFU,同时结合时间戳淘汰。比如用户信息频繁访问(头像显示),动态列表按时间倒序加载,较旧动态被淘汰。缓存大小根据设备内存(1GB手机,图片缓存200MB,数据缓存100MB)和访问日志(统计访问频率、时间戳)动态调整,热点数据优先保留,冷数据更激进淘汰,确保缓存命中率80%左右,内存占用合理。”

6) 【追问清单】

  • 问:如何动态计算缓存大小?
    回答要点:根据设备内存(如1GB手机,图片缓存占20%,数据缓存占10%),结合用户行为统计(图片访问量、数据访问量),定期调整。
  • 问:数据缓存如何保证一致性?
    回答要点:服务器数据更新时,通过观察者模式或轮询机制刷新,设置缓存过期时间(如用户信息5分钟更新一次),避免旧数据。
  • 问:图片压缩具体方法?
    回答要点:采用WebP格式(比JPEG小30%),或按比例缩放(缩放至屏幕尺寸),减少像素数。
  • 问:如何动态调整LRU/LFU参数?
    回答要点:通过访问日志(统计访问频率、时间戳),分析热点数据,调整缓存类型,比如热点数据从LRU切换更优策略,冷数据淘汰更激进。

7) 【常见坑/雷区】

  • 坑1:混淆LRU与LFU适用场景,用LFU处理图片缓存,导致冷数据占用内存,图片命中率低。
    雷区:图片缓存用LRU,因为图片访问频率差异小,LRU更高效。
  • 坑2:忽略图片内存占用,存原始图片。
    雷区:必须压缩(WebP、缩放),避免OOM。
  • 坑3:缓存淘汰静态,不动态调整。
    雷区:随用户行为变化(冷启动到热启动),动态切换策略,否则命中率下降。
  • 坑4:数据缓存一致性缺失。
    雷区:服务器更新时未及时刷新,导致用户看到旧数据,需结合网络请求和过期时间。
  • 坑5:缓存大小设置不合理。
    雷区:过小导致频繁淘汰(命中率低),过大导致内存占用过高(OOM)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1