面試:弱網(wǎng)環(huán)境-緩存策略 硼一、2萬條數(shù)據(jù)的通訊錄。

面試總結(jié)1

我是從來都不做面試總結(jié)的人梦抢,希望能就這些問題和大叫交流下~
這次面試問的都是和簡歷相關(guān)的知識般贼,還有就是其他的一些,在此做下記錄。


題目一:在你們項目中哼蛆,弱網(wǎng)環(huán)境下的網(wǎng)絡(luò)如何適配蕊梧,緩存策略是什么?

緩存策略

其實在我的項目中腮介,因為數(shù)據(jù)需求量比較小肥矢,我們在全局界面使用了一個名為UserInfo的一張表來存儲當(dāng)前App需要使用的模版數(shù)據(jù),這個工作在每次登陸的時候會更新叠洗,每次在從后臺切入前臺的時候也會校驗芥喇,在必要的網(wǎng)絡(luò)請求中也會帶上一個Version的東西進(jìn)行校驗塔橡。
也就是說我會在我的用戶登陸的時候我就拿到接近15個左右的模版數(shù)據(jù)嗤练,我的界面邏輯(因為用戶不同把兔,界面是不同的)幾乎全部包含在內(nèi)。設(shè)計的字段包含有:見注1
這樣做本質(zhì)上是一個優(yōu)化策略名挥,而不是用來應(yīng)對弱網(wǎng)環(huán)境疟羹。其實這個答案已經(jīng)很接近緩存策略的正確答案了,我們拆分出來看禀倔,這個本質(zhì)上包含了3個東西:

  1. 本地數(shù)據(jù)緩存映射表以及過期時間(客戶端寫死)
  2. 本地要緩存的數(shù)據(jù)及Version
  3. 服務(wù)器數(shù)據(jù)
    借鑒我之前看過的一篇文章榄融,主要內(nèi)容我在這里做下搬運:
  4. 使用ETag來代替Version,一般使用Hash算法來生成救湖,這種方式是模仿Git對文件的緩存機(jī)制愧杯。
  5. 新增If_none_match字段,和ErrorCode=304字段來判斷數(shù)據(jù)是否與服務(wù)端一致鞋既。
  6. 新增響應(yīng)頭CC(Cache-Contorl), 來控制具體的緩存機(jī)制
CC中的響應(yīng)頭 響應(yīng)頭描述
max_age 最大過期時間
pubilc/private 是否允許中間服務(wù)器(例如:CDN)來保存緩存信息
no_cache 客戶端使用緩存數(shù)據(jù)的時候必須與服務(wù)器進(jìn)行確認(rèn)后才可以使用
no_store 客戶端必須從服務(wù)器獲取新的數(shù)據(jù)

使用了這種方式力九,就可以不用每次發(fā)版都更新客戶端的緩存策略了,只需要在客戶端維護(hù)一個緩存映射表邑闺,將緩存數(shù)據(jù)和映射數(shù)據(jù)當(dāng)作字段傳入跌前,做網(wǎng)絡(luò)請求的時候讀取就好了~

提高數(shù)據(jù)傳輸速度

之前我哥們給我講,弱網(wǎng)優(yōu)化上可以使用UDP協(xié)議+減少握手次數(shù)陡舅,從而減小時間上的開銷抵乓,回去翻了下書,UDP雖然比TCP速度更加快速靶衍,但是總體省略掉的是數(shù)據(jù)正確性和數(shù)據(jù)順序灾炭,UDP比TCP省略的是TCP中各種校驗位,而我們所說弱網(wǎng)不單單是網(wǎng)絡(luò)速度慢颅眶,而是網(wǎng)絡(luò)不穩(wěn)定蜈出,導(dǎo)致丟包率\時延比較大,相比于使用UDP協(xié)議我更傾向于使用更加安全的TCP協(xié)議帚呼。
UDP應(yīng)用場景: 1.面向數(shù)據(jù)報方式 2.網(wǎng)絡(luò)數(shù)據(jù)大多為短消息 3.擁有大量Client 4.對數(shù)據(jù)安全性無特殊要求5.網(wǎng)絡(luò)負(fù)擔(dān)非常重掏缎,但對響應(yīng)速度要求高

解釋

也就是本地維護(hù)一個映射文件,當(dāng)然這個文件要滿足以下幾個條件:

文件要從服務(wù)器上分發(fā)煤杀。
這個配置表要在本地可配置眷蜈。
要有默認(rèn)的配置,一般是全網(wǎng)都可以訪問的服務(wù)器沈自。


減少時延酌儒,和丟包

DNS

  • 多服務(wù)器篩選:在啟動App之后,啟一個后臺進(jìn)程枯途,來掃描你們公司所有服務(wù)器域名的鏈接速度忌怎,和丟包率,優(yōu)先選擇服務(wù)器酪夷。在本地端口做適配榴啸。
  • IP:使用IP地址而不是使用域名,(其實客戶端本身就存在DNS_cache機(jī)制晚岭,也有自己的過期策略鸥印,iOS端一般是24h/飛行模式/開關(guān)機(jī)/重置網(wǎng)絡(luò)),在做多服務(wù)器篩選表的時候我們可以順帶把這部分的東西一起做出來坦报。

界面和服務(wù)端

監(jiān)控優(yōu)化

  • Web頁:在開發(fā)者模式下找到加載/運行緩慢的點库说,然后優(yōu)化。
  • Image:使用緩存片择,并根據(jù)網(wǎng)絡(luò)判定請求圖片大小潜的,在經(jīng)過源哥指點下,這里還可以使用Web格式的Image來對Image進(jìn)行壓縮字管,感謝
  • Data: 緩存json啰挪,使用游標(biāo)來確定當(dāng)前緩存的畫像-數(shù)據(jù)時效性要求差。
  • Text&Image: 優(yōu)先加載Text數(shù)據(jù)嘲叔,Image數(shù)據(jù)延后加載
  • Servers:使用慢查詢監(jiān)控脐供,并建立索引表。

容忍度

  • 提示框:不從0開始借跪,而是從50%開始政己。
  • 顯示預(yù)計時間= 實際預(yù)計時間/2

預(yù)加載

在WebView中我們可以使用本地Html,css掏愁,js文件來預(yù)加載歇由。
本地User_App界面數(shù)據(jù)采用數(shù)據(jù)預(yù)加載的方式。
User_info數(shù)據(jù)采用在登陸時候預(yù)先加載的方法是來做果港。

補(bǔ)充

其實我還看到很多優(yōu)化的方式沦泌,歡迎評論補(bǔ)充

  • 如使用base64預(yù)先壓縮數(shù)據(jù)(雖然壓縮比能達(dá)到34%,但是一般在大數(shù)據(jù)上才做壓縮辛掠,小數(shù)據(jù))谢谦。
  • 如使用XML可以變解析邊下載释牺。但是我覺得有些靠譜,有些因為過于消耗性能回挽,有些因為需要代碼的統(tǒng)一没咙,被我pass。

附錄

注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萬條數(shù)據(jù)的通訊錄千劈,你是如何存儲和展示的祭刚!

其實對于10萬條以內(nèi)的數(shù)據(jù)我認(rèn)為都沒必要對原生做大的修改,然后面試官又說還要顯示圖片什么的墙牌。涡驮。What?喜滨?加圖片捉捅?加圖片干嘛?虽风。锯梁。算了..考慮到我還是個初學(xué)者..在這里老老實實分析需求就好了。焰情。陌凳。

首先先簡單分析問題!

  1. 數(shù)據(jù)可能是沒有上限的内舟。需要考慮超級少人使用合敦,和超級多人使用的不同需求
  2. 因為涉及到圖片,可能需要設(shè)計下載验游,緩存充岛,渲染等
  3. 因為數(shù)據(jù)量龐大,是否使用數(shù)據(jù)庫耕蝉,建立一個什么樣的表
  4. 因為表格本身就涉及動畫的崔梗,更涉及到圖片,可能還會有圖片渲染的一些問題等~
  5. 可能涉及到??垒在,就是快速比較~

進(jìn)一步細(xì)化問題

  1. 圖片
    下載到哪里蒜魄?Cache,F(xiàn)ileSystem
    預(yù)處理场躯?時機(jī)
    預(yù)處理的圖片是否緩存谈为。
  2. 動畫
    使用什么方式加載Image:
    (1)CGContextWithoutAlpha,
    (2)CGContextWithAlpha,
    (3)ImageIO,
    (4)UIGraphic
    是否在滑動時候阻斷動畫/使用更低質(zhì)量的圖?
    是否在渲染的時候使用動畫踢关?
  3. 存儲
    存儲方式SQL伞鲫?UserDefault?FailSystem签舞?
    都存儲什么秕脓?UserInfo柒瓣?UserPhoto?
  4. 緩存
    在加載/移出圖片的時候是否使用緩存吠架?
  5. 界面差異化
    是否對500人以上的大客戶使用其他的界面代替掉當(dāng)前的界面芙贫?
    是否對500人以上的大客戶使用不同的解決方案/遷移方案?
    是否對500人以上的大客戶使用數(shù)據(jù)備份方案诵肛?容錯方案
  6. 查找
    查找方式屹培?(1)SQL(2)內(nèi)存

逐一解答上面的問題

圖片

  • 下載到哪里默穴?Cache怔檩,F(xiàn)ileSystem
    首先在這里可以考慮使用FileSystem而不是Cache,因為這里的數(shù)據(jù)要保證用戶數(shù)據(jù)安全蓄诽,而不是使用一次就扔掉薛训,應(yīng)該對數(shù)據(jù)在下載的時候進(jìn)行保存,并留有副本~
  • 預(yù)處理仑氛?時機(jī)乙埃、做什么
    (1)在數(shù)據(jù)下載之后直接進(jìn)行預(yù)處理。
    (2)對圖片進(jìn)行格式調(diào)整锯岖、去除透明通道介袜、圓角調(diào)整,分辨率調(diào)整出吹,小圖單獨存儲
  • 預(yù)處理的圖片是否緩存遇伞。
    只分文件夾存儲,不緩存捶牢。

動畫

  • 使用什么方式加載Image:
    (1)CGContextWithoutAlpha,
    (2)CGContextWithAlpha,
    (3)ImageIO,
    (4)UIGraphic

SDWebImage使用的CGContextWithoutAlpha鸠珠,和CGContextWithAlpha,這兩種加載方式在在性能上由于UIGraphic秋麸,在單線程中ImageIO(370)卻優(yōu)于CGContextWithAlpha(550)渐排,可見蘋果在ImageIO上確實是下了大功夫的,但在多線程中CGContextWithAlpha(420)表現(xiàn)優(yōu)于ImageIO(730)灸蟆,由此可見在使用ImageIO可以能發(fā)揮更高的性能驯耻。(而且使用單線程就好了~)

  • 是否在滑動時候阻斷動畫/使用更低質(zhì)量的圖?
    在快速滑動的時候我建議是停止Image的繪制的炒考,在ScrollView的回調(diào)方法中可以做到
    在慢速滑動的時候還是使用更加低質(zhì)量的圖片會讓幀數(shù)有更好的表現(xiàn)吓歇。
  • 是否在渲染的時候使用動畫?
    建議使用延遲加載的額方式票腰,而不是當(dāng)時加載~這個主要看需求~

存儲

存儲方式SQL城看?UserDefault?FailSystem杏慰?
照顧到可能需要查找测柠,應(yīng)該使用SQL炼鞠,SQL在iOS上支持的還是很好的。如果使用SQL就逃脫不了表的使用轰胁,這里要著重說一下谒主,面試官問我是否每一個索引都要建一張表?(索引為a的表赃阀、b的表……)Why?完全不理解為什么這么做..理由呢霎肯?速度快么?維護(hù)簡單榛斯?代碼簡潔观游?凸顯自己設(shè)計牛逼?感覺并不會啊..考慮到我還是個初學(xué)者這里需要大神指點驮俗!

都存儲什么懂缕?UserInfo?UserPhoto王凑?

是的都需要而且是分別存儲~

緩存

在加載/移出圖片的時候是否使用緩存搪柑?
不使用緩存~

界面差異化

  • 是否對500人以上的大客戶使用其他的界面代替掉當(dāng)前的界面?
    界面差異化其實是可以考慮的索烹,因為在小規(guī)模數(shù)據(jù)上工碾,Photo在查找人員上會很方便,但是在200人以上的時候就會大大不便了百姓,應(yīng)該更注重搜索和索引~這才是對用戶更大的幫助
  • 是否對500人以上的大客戶使用不同的解決方案/遷移方案渊额?
    可以考慮使用不同的解決方案,數(shù)據(jù)遷移方案應(yīng)該是統(tǒng)一的~
  • 是否對500人以上的大客戶使用數(shù)據(jù)備份方案瓣戚?容錯方案
    應(yīng)該強(qiáng)制讓500人以上用戶打開通訊錄備份功能端圈,導(dǎo)出功能應(yīng)該提供導(dǎo)出到通訊錄,但是不應(yīng)該提供其他的導(dǎo)出功能子库,畢竟考慮到用戶的隱私問題舱权,我們應(yīng)該盡可能把數(shù)據(jù)留在安全的地方!
    我建議把容錯改成容災(zāi)方案仑嗅,在服務(wù)器保存一張更復(fù)雜的表格來加密存儲用戶數(shù)據(jù)宴倍!使用hash算法來做數(shù)據(jù)進(jìn)行校驗位!當(dāng)然這些都是在服務(wù)器中的仓技!~

查找

查找方式鸵贬?(1)SQL(2)內(nèi)存
SQL速度更慢,但是計算性能消耗并不多~
內(nèi)存速度快脖捻,實現(xiàn)難度大阔逼,計算性能消耗大仁者見仁吧~請各位大神指正~

后記 安全性

在考慮到這里的時候我就在想,我們的數(shù)據(jù)安全性誰來保證地沮,我們存在iPhone上的數(shù)據(jù)如果是被越獄的手機(jī)嗜浮,那樣其他的流氓軟件不是可以很輕易的獲取我們聯(lián)系人數(shù)據(jù)了么羡亩,如果上面有身份證號碼,這簡直不敢想象危融。嚇得我都炸毛了~
考慮到我是一個新手畏铆,隨便使用一個我們公司的通用密鑰算出publicKey,采用非對稱算法加密吧~反正注意到的人又不多吉殃。辞居。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛋勺,隨后出現(xiàn)的幾起案子瓦灶,更是在濱河造成了極大的恐慌,老刑警劉巖迫卢,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倚搬,死亡現(xiàn)場離奇詭異冶共,居然都是意外死亡乾蛤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門捅僵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來家卖,“玉大人,你說我怎么就攤上這事庙楚∩系矗” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵馒闷,是天一觀的道長酪捡。 經(jīng)常有香客問我,道長纳账,這世上最難降的妖魔是什么逛薇? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮疏虫,結(jié)果婚禮上永罚,老公的妹妹穿的比我還像新娘。我一直安慰自己卧秘,他們只是感情好呢袱,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翅敌,像睡著了一般羞福。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚯涮,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天治专,我揣著相機(jī)與錄音焊唬,去河邊找鬼。 笑死看靠,一個胖子當(dāng)著我的面吹牛赶促,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挟炬,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸥滨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谤祖?” 一聲冷哼從身側(cè)響起婿滓,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粥喜,沒想到半個月后凸主,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡额湘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年卿吐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锋华。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗡官,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毯焕,到底是詐尸還是另有隱情衍腥,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布纳猫,位于F島的核電站婆咸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芜辕。R本人自食惡果不足惜尚骄,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望物遇。 院中可真熱鬧乖仇,春花似錦、人聲如沸询兴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诗舰。三九已至警儒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜀铲。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工边琉, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人记劝。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓变姨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厌丑。 傳聞我的和親對象是個殘疾皇子定欧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容