当面试官要你设计一个图片缓存设计的时候,你需要回答哪些东西?

421 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天 点击查看活动详情

SDWebImage这个第三方库应该大家都耳熟能详把,面试的时候面试官会问道:

如果让你设计一个类似的图片缓存设计,你该怎么做?

我想SDWebImage的工作原理大家应该也应该清楚,就是先查cache,再查disk,没有就下载,完成后存disk,存cache(只是概述,具体的可以自行百度)。但是面试官要我们去自己设计一个,确实很容易卡壳。

作者我呢,也同样遇到过,记得当时答的就不好。后来呢,下来仔细研究后,通过参考其他的设计,希望给大家一个参考把。

首先上图

截屏2022-03-18 下午5.31.01.png

这个整体架构呢,不算特别复杂,但是里面有几个重点需要大家去详细说明。

内存设计

在内存设计里,我们需要考虑下面两个问题

  1. 存储的size
  2. 淘汰策略

这两个问题算是设计内存中必不可少的出题点,并且很容易考察面试者有没有完善架构的能力

存储的size

使用队列的方式去存储

  • 10KB以下的图片,在内存中分配10个
  • 100KB以下的,分配20个
  • 大于100KB的,分配10个
淘汰策略

下面给出两解决方案

  • 队列方式,先进先出
  • LRU算法(最近最久未使用的算法)
    • 定时检查
    • 提高检查触发频率
      • 每次读写时
      • 前后台切换时

磁盘设计

需要考虑问题

  1. 存储方式(可以去做类似内存的方式去存储)
  2. 大小限制(如100M)
  3. 淘汰策略(超过7天删除等)

网络设计

需要考虑问题

  1. 图片请求最大并发量(作为参数可以由用户定义,但是不能超过最大值)
  2. 请求超时策略(重试机制)
  3. 请求优先级

图片解码设计

对于不同格式,解码采用什么方式

  • 使用策略模式对不同图片的格式进行解码

在哪个阶段进行解码处理

  • 磁盘读取后
  • 网络请求后

图片查找设计

需要考虑问题

  • 如何快速的去查找图片

图片是通过键值对的方式去存还是使用HASH表的方式去存?

如果了解过我之前的文章当面试官问Runtime时,想听到的答案是什么? 里面obj_class的数据结构应该可以知道,里面有个cache_t的HASH表,就是放这个对象常用的方法的,使用HASH的方法去查肯定会更快。


结语

总体来说,如果有面试问道这种问题,除非是真的有设计过这种框架,不然很容易答不上来,所以呢,不要急,先考虑几分钟,想想之前有过什么可以类似的,可以推倒一下。

当然,如果你读了这篇文章,遇到这种问题,也不要这么快回答,毕竟感觉像背书^_^。

说几个关键点就行。

如果有帮助到你,点个赞把!