iOS架構補完計劃--高并發(fā)下的緩存策略

通常一個APP分為網(wǎng)絡践美、數(shù)據(jù)谋作、業(yè)務等多個層級旺坠。
只看數(shù)據(jù)層、最基本的模式如下馋缅。

VC從DB層讀取數(shù)據(jù)、交由View進行展示绢淀。

iOS進階補完計劃-多線程數(shù)據(jù)緩存-1

然而萤悴、當同一個VC需要多次讀取、或者多個VC都需要像DB讀取數(shù)據(jù)的時候皆的。就會出現(xiàn)如下問題覆履。

  • 同一個資源被多次IO讀取、就會出現(xiàn)資源的浪費。


    iOS進階補完計劃-多線程數(shù)據(jù)緩存-2

于是硝全、通常我們都會在DB與VC之間栖雾、插入一層緩存。


WechatIMG279.jpeg

將DB讀取出來的數(shù)據(jù)伟众、交由Cache單例持有析藕。

  • 同一個DB資源不再需要被多次讀取、VC只需要從單例Cache中獲取數(shù)據(jù)即可赂鲤。

但使用單例對象噪径、又會出現(xiàn)另外一個問題。

線程安全数初。

當在有一個線程操作一個單例對象找爱、另一個線程同時使用了這個對象、哪怕只是讀取泡孩、一樣會出現(xiàn)崩潰车摄。


iOS進階補完計劃-多線程數(shù)據(jù)緩存-3

針對多線程的資源搶奪、幾個解決方案仑鸥。

  • 原子鎖

    @property (atomic) NSArray * walletDatas;
    

這樣吮播、將cache中會被改變的對象都加上atomic就行了。
但是眼俊、過多的atomic會拖慢app性能意狠。過多的使用鎖也可能導致一些難以捕捉的bug。

修正一下疮胖、即使是atomic环戈、也只能保證set&&get方法的線程安全。在進行對象操作的時候澎灸。也是要崩潰的院塞。

詳見我的另一篇博客:傳送門

iOS進階補完計劃-多線程數(shù)據(jù)緩存-4

所以、需要在每個對象的對象方法操作中性昭、也加入線程鎖拦止。

  • 分線程cache

將每一個線程單獨分配一個cache。每個線程中的讀寫糜颠、只操作對應線程中的cache汹族、也可以解決資源搶奪的問題。
但是需要明確的知曉哪次讀寫其兴、在哪個線程中進行顶瞒。線程間數(shù)據(jù)的同步也很麻煩。

  • readonly
    @property (nonatomic,readonly) NSArray * walletDatas;
    

這是我們采用的方案忌警。
緩存中的屬性搁拙、外部只允許讀取秒梳、不允許寫入。
數(shù)據(jù)如何更改呢箕速?
當需要修改數(shù)據(jù)源酪碘、需要調用cache對應的方法。

  //從數(shù)據(jù)庫更新數(shù)據(jù)
  - (void)updata;
  //插入
  - (void)pushWalletData:(BSWalletData *)data callback:(walletCacheCallBack)callback;
  //刪除
  - (void)delWalletDataWithPrivateKey:(NSString *)privateKey callback:(walletCacheCallBack)callback;;
  //刪除全部
  - (void)delAllWalletData:(walletCacheCallBack)callback;
  
  - (void)setDefaultWalletData:(BSWalletData *)walletData callback:(walletCacheCallBack)callback;

內(nèi)部的實現(xiàn)大致為一些邏輯判斷盐茎、資源格式化兴垦、然后嘗試對DB進行操作。
如果操作成功字柠、再對cache單例中的緩存數(shù)據(jù)進行更新探越。
更新、便是將cache中的整個屬性進行替換窑业。

但是這樣處理钦幔、又會出現(xiàn)兩個問題。

  • 如何保證替換的時候不會正好因為其他線程也在數(shù)據(jù)讀取常柄、導致crash鲤氢。

  • 在替換之后、上層業(yè)務者如何依舊持有者舊的數(shù)據(jù)西潘、怎樣更新卷玉。

針對以上兩個問題、我們的解決方案大致如下:

  @interface BSWalletCache : NSObject
  
  @property (nonatomic ,readonly) BSWalletDataSource * walletDataSrource;
  
  @end
  
  @interface BSWalletCache()
  @property (atomic) BSWalletDataSource * dataSource;
  
  @end
  
  @implementation BSWalletCache
  
  
  - (BSWalletDataSource *)walletDataSrource {
      return self.dataSource;
  }
  
  @end

  ***************
  
  @interface BSWalletDataSource : NSObject
  
  @property (nonatomic) BOOL dirty;
  
  @property (nonatomic,readonly) NSArray * walletDatas;
  
  @end

原理大致如下:


iOS進階補完計劃-多線程數(shù)據(jù)緩存-5

針對公司的項目喷市、我在Cache層與DB層之間又加了一個中間層Mediater相种。
一是為了將Cache更好的抽離出來做去處理緩存。
二是更好的應對將來的需求變化(存儲方式品姓、格式化標準等)寝并。

NSCache

解釋下為什么不用NSCache
NSCache在存取的時候是線程安全的沒錯。但是和屬性的atomic一樣缭黔、進行對象操作的時候并不安全食茎。


3161520229858_.pic_hd.jpg

Demo

demo是直接把剛寫好的公司模塊蒂破、脫敏之后拿出來的馏谨。沒什么UI、只是寫了幾個button測試附迷。
《有興趣可以自取》


最后

本文主要是自己的學習與總結惧互。如果文內(nèi)存在紕漏、萬望留言斧正喇伯。如果不吝賜教小弟更加感謝喊儡。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市稻据,隨后出現(xiàn)的幾起案子艾猜,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匆赃,死亡現(xiàn)場離奇詭異淤毛,居然都是意外死亡,警方通過查閱死者的電腦和手機算柳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進店門低淡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瞬项,你說我怎么就攤上這事蔗蹋。” “怎么了囱淋?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵猪杭,是天一觀的道長。 經(jīng)常有香客問我妥衣,道長胁孙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任称鳞,我火速辦了婚禮涮较,結果婚禮上,老公的妹妹穿的比我還像新娘冈止。我一直安慰自己狂票,他們只是感情好,可當我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布熙暴。 她就那樣靜靜地躺著闺属,像睡著了一般。 火紅的嫁衣襯著肌膚如雪周霉。 梳的紋絲不亂的頭發(fā)上掂器,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天,我揣著相機與錄音俱箱,去河邊找鬼国瓮。 笑死,一個胖子當著我的面吹牛狞谱,可吹牛的內(nèi)容都是我干的乃摹。 我是一名探鬼主播,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼跟衅,長吁一口氣:“原來是場噩夢啊……” “哼孵睬!你這毒婦竟也來了?” 一聲冷哼從身側響起伶跷,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤掰读,失蹤者是張志新(化名)和其女友劉穎秘狞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹈集,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡谒撼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了雾狈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片廓潜。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖善榛,靈堂內(nèi)的尸體忽然破棺而出辩蛋,到底是詐尸還是另有隱情,我是刑警寧澤移盆,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布悼院,位于F島的核電站,受9級特大地震影響咒循,放射性物質發(fā)生泄漏据途。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一叙甸、第九天 我趴在偏房一處隱蔽的房頂上張望颖医。 院中可真熱鬧,春花似錦裆蒸、人聲如沸熔萧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佛致。三九已至,卻和暖如春辙谜,著一層夾襖步出監(jiān)牢的瞬間俺榆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工装哆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留罐脊,地道東北人。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓烂琴,卻偏偏與公主長得像爹殊,于是被迫代替她去往敵國和親蜕乡。 傳聞我的和親對象是個殘疾皇子奸绷,可洞房花燭夜當晚...
    茶點故事閱讀 43,606評論 2 350

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,837評論 25 707
  • 紀錄片《東京偶像》,從一個東京的地下偶像女歌手RIO莉緒的追夢故事入手层玲,讓我們透過這個視角看到了日本偶像宗教...
    導演宋健君閱讀 2,546評論 0 1
  • 時代在變号醉,科技在更新反症,就連豐富的中國語言文字也出現(xiàn)了好多新的名詞。前幾年的囧畔派,綠茶婊铅碍,紅茶婊,圣母白蓮花线椰,...
    端木靈樞閱讀 373評論 2 3
  • 看到過一段話:當你認真談過一段感情胞谈,最后卻分手了,后來你會很難再去喜歡別人憨愉,你不想花時間也不想去了解烦绳。 其實每個人...
    花未全開月未圓2018閱讀 291評論 0 0