一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天 点击查看活动详情。
SDWebImage这个第三方库应该大家都耳熟能详把,面试的时候面试官会问道:
如果让你设计一个类似的图片缓存设计,你该怎么做?
我想SDWebImage的工作原理大家应该也应该清楚,就是先查cache,再查disk,没有就下载,完成后存disk,存cache(只是概述,具体的可以自行百度)。但是面试官要我们去自己设计一个,确实很容易卡壳。
作者我呢,也同样遇到过,记得当时答的就不好。后来呢,下来仔细研究后,通过参考其他的设计,希望给大家一个参考把。
首先上图
这个整体架构呢,不算特别复杂,但是里面有几个重点需要大家去详细说明。
内存设计
在内存设计里,我们需要考虑下面两个问题
- 存储的size
- 淘汰策略
这两个问题算是设计内存中必不可少的出题点,并且很容易考察面试者有没有完善架构的能力
存储的size
使用队列的方式去存储
- 10KB以下的图片,在内存中分配10个
- 100KB以下的,分配20个
- 大于100KB的,分配10个
淘汰策略
下面给出两解决方案
- 队列方式,先进先出
- LRU算法(最近最久未使用的算法)
- 定时检查
- 提高检查触发频率
- 每次读写时
- 前后台切换时
磁盘设计
需要考虑问题
- 存储方式(可以去做类似内存的方式去存储)
- 大小限制(如100M)
- 淘汰策略(超过7天删除等)
网络设计
需要考虑问题
- 图片请求最大并发量(作为参数可以由用户定义,但是不能超过最大值)
- 请求超时策略(重试机制)
- 请求优先级
图片解码设计
对于不同格式,解码采用什么方式
- 使用策略模式对不同图片的格式进行解码
在哪个阶段进行解码处理
- 磁盘读取后
- 网络请求后
图片查找设计
需要考虑问题
- 如何快速的去查找图片
图片是通过键值对的方式去存还是使用HASH表的方式去存?
如果了解过我之前的文章当面试官问Runtime时,想听到的答案是什么? 里面obj_class的数据结构应该可以知道,里面有个cache_t的HASH表,就是放这个对象常用的方法的,使用HASH的方法去查肯定会更快。
结语
总体来说,如果有面试问道这种问题,除非是真的有设计过这种框架,不然很容易答不上来,所以呢,不要急,先考虑几分钟,想想之前有过什么可以类似的,可以推倒一下。
当然,如果你读了这篇文章,遇到这种问题,也不要这么快回答,毕竟感觉像背书^_^。
说几个关键点就行。
如果有帮助到你,点个赞把!