erlang在處理緩存擊穿的優(yōu)勢

緩存穿透,是指查詢一個數據庫一定不存在的數據。正常的使用緩存流程大致是邻眷,數據查詢先進行緩存查詢,如果key不存在或者key已經過期音同,再對數據庫進行查詢,并把查詢到的對象秃嗜,放進緩存瘟斜。如果數據庫查詢對象為空,則不放進緩存痪寻。

1.緩存擊穿的偽代碼

Value find(Key){
    RedisKey = RedisKeyFunc(Key);
    V = redisGet(RedisKey);
    if (V != null){
        // 命中緩存
        return V;
    }
    V = dbLookUp(Key);
    if (v != null){
       redisPut(RedisKey,V);
    }
    // 如果沒有數據庫中更沒有數據,那么每次查找這條記錄就會去數據庫查詢一次虽惭,數據庫就像被攻擊一樣
    return V;
}


2.傳統的應對緩存擊穿的處理方案

采用redis全局鎖 + 自旋鎖

這樣子雖然是可以解決這個問題橡类,但是帶來的負面影響是空跑CPU

偽代碼:

Value find(Key){
    RedisKey = RedisKeyFunc(Key);
    V = redisGet(RedisKey);
    if (V != null){
        // 命中緩存
        return V;
    }
    
    RedisLockKey = RedisLockKeyFunc(Key)
    while(true){
        if(redisLock(RedisLockKey)){
            V = redisGet(RedisKey);
            if( V == null){
               // 從數據庫查詢放入緩存
               V = dbLookUp(Key);
               redisSet(RedisKey,V);
            }
            redisUnLock(RedisLockKey);
            return V
        }
        // 這邊空跑消耗CPU
    }
}

3.erlang actor的模型

利用actor的消息傳遞機制,很輕松的避免自旋鎖(空跑)

偽代碼:


handle_call({find,Key},From,#{req=Req}=State) ->
  case lists:keyfind(Key,1, Req) of
   {_,L} ->
     Req2 = lists:keyreplace(Key,1,Req,{Key,[From|L]}),
     {noreply,State#state{req = Req2};
   false ->
     Actor = self(),
     % 新開一個proc去處理查詢芽唇,將結果放進緩存
     erlang:spawn(fun()-> V = lookup(Key), Actor ! {Key,V}), 
     Req2 = [{Key,[From]}|Req],
     {noreply,State#state{req = Req2};


handle_info({Key,V},#state{req = Req})->
  case lists:keyfind(Key,1, Req) of
   {_,L} ->
     % 將結果發(fā)給所有的請求者顾画,CPU不會空跑
     [ gen_server:reply(From,V) ||  From<-L],
     Req2 = lists:keydelete(Key,1,Req),
     {noreply,State#state{req = Req2}};
   false ->
     {noreply,State#state{}};

相對上面而言主要節(jié)約了2點

  1. 自旋鎖帶來的CPU消耗
  2. 在獲得分布式鎖之后還要去緩存查一下,還有釋放分布式鎖匆笤,2次IO消耗

4.總結

合理利用消息傳遞機制研侣,可以很輕松的解決一些經典問題∨谂酰或許這就是一種范式吧庶诡。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市咆课,隨后出現的幾起案子末誓,更是在濱河造成了極大的恐慌,老刑警劉巖书蚪,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喇澡,死亡現場離奇詭異,居然都是意外死亡殊校,警方通過查閱死者的電腦和手機晴玖,發(fā)現死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呕屎,你說我怎么就攤上這事让簿。” “怎么了榨惰?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵拜英,是天一觀的道長。 經常有香客問我琅催,道長居凶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任藤抡,我火速辦了婚禮侠碧,結果婚禮上,老公的妹妹穿的比我還像新娘缠黍。我一直安慰自己弄兜,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布瓷式。 她就那樣靜靜地躺著替饿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贸典。 梳的紋絲不亂的頭發(fā)上视卢,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音廊驼,去河邊找鬼据过。 笑死,一個胖子當著我的面吹牛妒挎,可吹牛的內容都是我干的绳锅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼酝掩,長吁一口氣:“原來是場噩夢啊……” “哼鳞芙!你這毒婦竟也來了?” 一聲冷哼從身側響起庸队,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤积蜻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后彻消,有當地人在樹林里發(fā)現了一具尸體竿拆,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年宾尚,在試婚紗的時候發(fā)現自己被綠了丙笋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谢澈。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖御板,靈堂內的尸體忽然破棺而出锥忿,到底是詐尸還是另有隱情,我是刑警寧澤怠肋,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布敬鬓,位于F島的核電站,受9級特大地震影響笙各,放射性物質發(fā)生泄漏钉答。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一杈抢、第九天 我趴在偏房一處隱蔽的房頂上張望数尿。 院中可真熱鬧,春花似錦惶楼、人聲如沸右蹦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽何陆。三九已至,卻和暖如春豹储,著一層夾襖步出監(jiān)牢的瞬間甲献,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工颂翼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人慨灭。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓朦乏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親氧骤。 傳聞我的和親對象是個殘疾皇子呻疹,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,090評論 1 32
  • --- layout: post title: "如果有人問你關系型數據庫的原理,叫他看這篇文章(轉)" date...
    藍墜星閱讀 780評論 0 3
  • 一粥一飯,當思來之不易筹陵,半絲半縷,恒念物力維艱刽锤,這大到飯店,小到百姓餐桌都會體現出一個人的基本素質朦佩。 所謂...
    好人一生走天涯閱讀 721評論 0 2
  • a我們進行到哪一步了并思? b我說,沒有什么老師了语稠,總之宋彼,前面路還看不清弄砍。有可能,還要碰運氣走输涕。 a那么未來的事物音婶,只...
    晴天在路上閱讀 188評論 0 0
  • 時光過的好快,轉眼二寶已經一歲四個多月了莱坎,在陪伴他的時間里衣式,我驚喜的目睹了他一點點長大!不經意間學會了各種各樣的本...
    良仁的向日葵閱讀 353評論 1 6