数据缓存

面试:弱网环境-缓存策略 、2万条数据的通讯录。

2017-07-05  本文已影响221人  李盛民

面试总结1

我是从来都不做面试总结的人,希望能就这些问题和大叫交流下~
这次面试问的都是和简历相关的知识,还有就是其他的一些,在此做下记录。


题目一:在你们项目中,弱网环境下的网络如何适配,缓存策略是什么?

缓存策略

其实在我的项目中,因为数据需求量比较小,我们在全局界面使用了一个名为UserInfo的一张表来存储当前App需要使用的模版数据,这个工作在每次登陆的时候会更新,每次在从后台切入前台的时候也会校验,在必要的网络请求中也会带上一个Version的东西进行校验。
也就是说我会在我的用户登陆的时候我就拿到接近15个左右的模版数据,我的界面逻辑(因为用户不同,界面是不同的)几乎全部包含在内。设计的字段包含有:见注1
这样做本质上是一个优化策略,而不是用来应对弱网环境。其实这个答案已经很接近缓存策略的正确答案了,我们拆分出来看,这个本质上包含了3个东西:

  1. 本地数据缓存映射表以及过期时间(客户端写死)
  2. 本地要缓存的数据及Version
  3. 服务器数据
    借鉴我之前看过的一篇文章,主要内容我在这里做下搬运:
  4. 使用ETag来代替Version,一般使用Hash算法来生成,这种方式是模仿Git对文件的缓存机制。
  5. 新增If_none_match字段,和ErrorCode=304字段来判断数据是否与服务端一致。
  6. 新增响应头CC(Cache-Contorl), 来控制具体的缓存机制
CC中的响应头 响应头描述
max_age 最大过期时间
pubilc/private 是否允许中间服务器(例如:CDN)来保存缓存信息
no_cache 客户端使用缓存数据的时候必须与服务器进行确认后才可以使用
no_store 客户端必须从服务器获取新的数据

使用了这种方式,就可以不用每次发版都更新客户端的缓存策略了,只需要在客户端维护一个缓存映射表,将缓存数据和映射数据当作字段传入,做网络请求的时候读取就好了~

提高数据传输速度

之前我哥们给我讲,弱网优化上可以使用UDP协议+减少握手次数,从而减小时间上的开销,回去翻了下书,UDP虽然比TCP速度更加快速,但是总体省略掉的是数据正确性和数据顺序,UDP比TCP省略的是TCP中各种校验位,而我们所说弱网不单单是网络速度慢,而是网络不稳定,导致丢包率\时延比较大,相比于使用UDP协议我更倾向于使用更加安全的TCP协议。
UDP应用场景: 1.面向数据报方式 2.网络数据大多为短消息 3.拥有大量Client 4.对数据安全性无特殊要求5.网络负担非常重,但对响应速度要求高

解释

也就是本地维护一个映射文件,当然这个文件要满足以下几个条件:

文件要从服务器上分发。
这个配置表要在本地可配置。
要有默认的配置,一般是全网都可以访问的服务器。


减少时延,和丢包

DNS

界面和服务端

监控优化

容忍度

预加载

在WebView中我们可以使用本地Html,css,js文件来预加载。
本地User_App界面数据采用数据预加载的方式。
User_info数据采用在登陆时候预先加载的方法是来做。

补充

其实我还看到很多优化的方式,欢迎评论补充

附录

注1

[user:(id, name, token, version, sig, update, next_update)] SQL如下
[viewData:(hash_token, view_id, view_data, version)]

create table 
if not exists User (    
    id int primary key AUTO_INCREMENT,
    name varchar(16)
    token int,
    version int,
    sig int,
    update int,
    next_update int
);

注2:

2.png 1.png

题目二: 2万条数据的通讯录,你是如何存储和展示的!

其实对于10万条以内的数据我认为都没必要对原生做大的修改,然后面试官又说还要显示图片什么的。。What??加图片?加图片干嘛?。。算了..考虑到我还是个初学者..在这里老老实实分析需求就好了。。。

首先先简单分析问题!

  1. 数据可能是没有上限的。需要考虑超级少人使用,和超级多人使用的不同需求
  2. 因为涉及到图片,可能需要设计下载,缓存,渲染等
  3. 因为数据量庞大,是否使用数据库,建立一个什么样的表
  4. 因为表格本身就涉及动画的,更涉及到图片,可能还会有图片渲染的一些问题等~
  5. 可能涉及到🔍,就是快速比较~

进一步细化问题

  1. 图片
    下载到哪里?Cache,FileSystem
    预处理?时机
    预处理的图片是否缓存。
  2. 动画
    使用什么方式加载Image:
    (1)CGContextWithoutAlpha,
    (2)CGContextWithAlpha,
    (3)ImageIO,
    (4)UIGraphic
    是否在滑动时候阻断动画/使用更低质量的图?
    是否在渲染的时候使用动画?
  3. 存储
    存储方式SQL?UserDefault?FailSystem?
    都存储什么?UserInfo?UserPhoto?
  4. 缓存
    在加载/移出图片的时候是否使用缓存?
  5. 界面差异化
    是否对500人以上的大客户使用其他的界面代替掉当前的界面?
    是否对500人以上的大客户使用不同的解决方案/迁移方案?
    是否对500人以上的大客户使用数据备份方案?容错方案
  6. 查找
    查找方式?(1)SQL(2)内存

逐一解答上面的问题

图片

动画

SDWebImage使用的CGContextWithoutAlpha,和CGContextWithAlpha,这两种加载方式在在性能上由于UIGraphic,在单线程中ImageIO(370)却优于CGContextWithAlpha(550),可见苹果在ImageIO上确实是下了大功夫的,但在多线程中CGContextWithAlpha(420)表现优于ImageIO(730),由此可见在使用ImageIO可以能发挥更高的性能。(而且使用单线程就好了~)

存储

存储方式SQL?UserDefault?FailSystem?
照顾到可能需要查找,应该使用SQL,SQL在iOS上支持的还是很好的。如果使用SQL就逃脱不了表的使用,这里要着重说一下,面试官问我是否每一个索引都要建一张表?(索引为a的表、b的表……)Why?完全不理解为什么这么做..理由呢?速度快么?维护简单?代码简洁?凸显自己设计牛逼?感觉并不会啊..考虑到我还是个初学者这里需要大神指点!

都存储什么?UserInfo?UserPhoto?

是的都需要而且是分别存储~

缓存

在加载/移出图片的时候是否使用缓存?
不使用缓存~

界面差异化

查找

查找方式?(1)SQL(2)内存
SQL速度更慢,但是计算性能消耗并不多~
内存速度快,实现难度大,计算性能消耗大仁者见仁吧~请各位大神指正~

后记 安全性

在考虑到这里的时候我就在想,我们的数据安全性谁来保证,我们存在iPhone上的数据如果是被越狱的手机,那样其他的流氓软件不是可以很轻易的获取我们联系人数据了么,如果上面有身份证号码,这简直不敢想象。吓得我都炸毛了~
考虑到我是一个新手,随便使用一个我们公司的通用密钥算出publicKey,采用非对称算法加密吧~反正注意到的人又不多。。

上一篇下一篇

猜你喜欢

热点阅读