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

设计一个客户端的视频缓存系统,考虑视频的冷热数据分离、存储空间限制和更新策略,并说明如何实现?

快手客户端开发工程师 📦 工程类难度:中等

答案

1) 【一句话结论】
核心是采用多级缓存架构(本地热缓存+冷存储),结合时间/访问频率的冷热分离策略(LRU+Time-based),通过动态空间分配和增量更新机制,在存储空间限制下高效管理视频数据,平衡加载速度与存储效率。

2) 【原理/概念讲解】
老师口吻解释关键概念:

  • 冷热数据分离:热数据是用户高频访问的视频(如热门推荐、最近播放),冷数据是低频访问的视频。分离方法有两种:
    • 时间维度:最近N天(如7天)内访问的算热,否则冷;
    • 访问频率:访问次数超过阈值(如24小时>5次)的算热,否则冷。
      类比:图书馆借阅,热门书籍(热数据)放在前台,冷书(冷数据)放在后库,需时再调。
  • 存储空间限制:本地存储有限(如SSD/内存),需淘汰冷数据。采用**LRU(最近最少使用)淘汰热缓存中最久未访问的冷数据,或Time-based(时间窗口)**淘汰冷存储中最旧的冷数据。
  • 更新策略:视频有新版本时,只下载差异部分(增量更新),减少流量和存储开销。

3) 【对比与适用场景】

策略类型定义特性使用场景注意点
LRU(基于访问时间)淘汰最久未访问的冷数据优先保留高频访问数据需求:快速访问高频数据(如视频播放列表)可能误判短时间不访问的热数据
Time-based(基于时间窗口)淘汰超过时间阈值的冷数据区分近期/远期数据需求:区分用户近期(如7天)和远期播放的视频需动态调整时间窗口

4) 【示例】
伪代码(缓存管理类):

class VideoCache:
    def __init__(self, max_size):
        self.max_size = max_size  # 本地存储最大空间(MB)
        self.hot_cache = LRU(max_size * 0.7)  # 热数据缓存(70%空间)
        self.cold_store = TimeBasedStore(max_size * 0.3)  # 冷数据存储(30%空间,按时间淘汰)
        self.video_map = {}  # 视频ID到缓存位置的映射

    def add_video(self, video_id, data, is_hot=True):
        if video_id in self.video_map:
            self.remove(video_id)
        if is_hot:
            if len(self.hot_cache) + len(data) > self.max_size * 0.7:
                evicted = self.hot_cache.pop_item()  # LRU淘汰最冷热数据
                self.cold_store.add(evicted.id, evicted.data)
        else:
            if len(self.cold_store) + len(data) > self.max_size * 0.3:
                evicted = self.cold_store.pop_oldest()  # Time-based淘汰最旧数据
                self.video_map.pop(evicted.id, None)
        self.hot_cache.add(video_id, data) if is_hot else self.cold_store.add(video_id, data)
        self.video_map[video_id] = {'hot': is_hot, 'data': data}

    def get_video(self, video_id):
        if video_id in self.hot_cache:
            self.hot_cache.touch(video_id)  # 更新访问时间
            return self.hot_cache.get(video_id)
        elif video_id in self.cold_store:
            data = self.cold_store.get(video_id)
            if data:
                self.hot_cache.add(video_id, data)  # 冷数据访问后提升为热
                self.cold_store.remove(video_id)
                return data
        return None

5) 【面试口播版答案】
“面试官您好,设计视频缓存系统,核心是平衡加载速度和存储效率。首先,采用多级缓存架构:本地存储分为热缓存(LRU,存储高频访问视频)和冷存储(时间窗口,存储低频视频),冷热分离依据访问频率或时间窗口。存储空间限制下,热缓存用LRU淘汰最久未访问的热数据,冷存储按时间淘汰旧数据。更新策略采用增量更新,新视频版本只下载差异部分,减少流量。实现上,通过缓存管理类维护视频数据,添加时根据热冷判断分配空间,获取时优先热缓存,冷数据访问后可能提升为热数据。这样既能快速加载热门视频,又能高效管理冷数据,避免存储溢出。”

6) 【追问清单】

  • 问:冷热分离的具体判断标准?
    答:比如访问频率超过阈值(如过去24小时访问次数>5次)或最近7天内有访问,算热数据,否则冷。
  • 问:存储空间如何动态分配?
    答:根据热数据访问频率动态调整,比如热数据占比70%,冷数据30%,当热数据占用超过阈值时,触发LRU淘汰。
  • 问:更新策略的细节?
    答:增量更新通过视频元数据(如时间戳、大小)比较,只下载变化部分,减少流量。
  • 问:并发处理?
    答:使用线程安全的数据结构(如锁或无锁数据结构),保证多线程访问时的数据一致性。
  • 问:性能优化?
    答:预加载热门视频,或根据用户行为预测可能访问的视频提前加载。

7) 【常见坑/雷区】

  • 冷热分离标准模糊,导致数据分类错误,影响缓存命中率;
  • 存储空间分配固定,未考虑动态变化,导致空间浪费或溢出;
  • 更新策略全量更新,增加流量和存储开销;
  • 缓存淘汰策略误判,比如LRU淘汰了正在播放的热视频,导致卡顿;
  • 未考虑并发问题,多线程访问时数据不一致。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1