后端應(yīng)用緩存最佳實踐

寫在前面

深入業(yè)務(wù),才能有好的設(shè)計准脂。在設(shè)計緩存的時候劫扒,要根據(jù)我們的業(yè)務(wù)特點,明白什么是不容易變的狸膏,什么是相對容易變粟关,什么是真正觸達用戶的,哪些數(shù)據(jù)是關(guān)鍵。這樣才能發(fā)現(xiàn)真正應(yīng)該cache的點闷板。

什么時候用緩存

緩存訪問頻率高澎灸、變化頻率低的數(shù)據(jù)
使用原則:在一致性要求不高(高一致性例如交易的賬戶)的情景下,數(shù)據(jù)層讀服務(wù)必須加緩存
數(shù)據(jù)服務(wù):直接跟DB交互的讀服務(wù)需要根據(jù)數(shù)據(jù)一致性要求(強弱分辨)加緩存
業(yè)務(wù)服務(wù):調(diào)用大量的外部讀服務(wù)拼裝結(jié)果的需要加緩存
緩存數(shù)據(jù)要盡可能的貼近用戶端遮晚,盡量高的從各類緩存中命中數(shù)據(jù)性昭,而不是訪問數(shù)據(jù)庫

何時不用緩存

對數(shù)據(jù)要求苛刻,變化頻率高县遣、訪問頻率低的數(shù)據(jù)不能緩存

緩存使用實現(xiàn)

cache implement
  • 本地緩存:可用hashmap(注意并發(fā))糜颠、guava-cache(推薦)等。對于一致性要求不高且緩存命中率較高的數(shù)據(jù)服務(wù)萧求,本地緩存可以減少服務(wù)端調(diào)用次數(shù)其兴;
  • 集中緩存:又稱分布式緩存,實現(xiàn)由redis(推薦)夸政、memcache等元旬。建議作為緩存使用,而不是存儲守问。在數(shù)據(jù)變化頻率很高的情況下匀归,可作為DB的寫入緩存

緩存的使用順序

內(nèi)存緩存>分布式緩存>數(shù)據(jù)庫

緩存的設(shè)計原則

CacheDesignPrinciple
  • 靜態(tài)化:數(shù)據(jù)盡量以目標展現(xiàn)的格式存儲,而不是存儲中間數(shù)據(jù)耗帕。減少數(shù)據(jù)格式化的時間消耗穆端,用空間換時間。
  • 專用化:數(shù)據(jù)靜態(tài)化后仿便,可使用的范圍有限体啰,應(yīng)盡量貼近用戶的結(jié)構(gòu),降低使用后的格式化成本嗽仪。
  • 隔離化:封裝緩存數(shù)據(jù)的訪問荒勇,把緩存的控制權(quán)掌握在自己手中。

緩存同步模式

  • 增量同步:按照時間戳或者數(shù)據(jù)變化更新緩存钦幔。
  • 全量同步:重新拉取所有的緩存數(shù)據(jù)。不建議采用此種模式常柄,性能差鲤氢,同步的數(shù)據(jù)量大。

緩存同步時機

  • 每次查詢時同步:在做查詢時西潘,檢驗數(shù)據(jù)的版本卷玉,然后進行緩存同步。
  • 增刪改時失效:在做數(shù)據(jù)的增刪改時喷市,同步修改緩存相种。
  • 定時同步:在緩存的駐留端定時更新緩存。此種模式適用于對數(shù)據(jù)的實時性要求不高的場景品姓。

緩存時效性

  • 有時效性:緩存數(shù)據(jù)存在時效性寝并,不管數(shù)據(jù)的版本有沒有變化箫措,過期失效。
  • 無時效性:只要數(shù)據(jù)的時間戳保持不變衬潦,緩存數(shù)據(jù)永久有效斤蔓。

緩存使用原則

  • 越少的緩存使用,越有價值镀岛。
  • 離最終的計算結(jié)果越近弦牡,越有價值。
  • 對于需要消耗I/O資源的緩存漂羊,要盡可能的減少調(diào)用的次數(shù)驾锰。

反復(fù)緩存所導(dǎo)致性能惡化的原因是無節(jié)制地使用緩存。緩存使用的指導(dǎo)原則是:工程師們在使用緩存時必須全局考慮走越,精細規(guī)劃椭豫,確保數(shù)據(jù)完全緩存的情況下,系統(tǒng)仍然不會頻繁full GC买喧。為了確保這一點捻悯,對于存在多種類型緩存以及系統(tǒng)流量變化很大的系統(tǒng),設(shè)計者必須嚴格控制緩存大小淤毛,甚至廢除緩存(這是典型為了提高流量高峰時可用性今缚,而降低平均響應(yīng)時間的一個例子)。反復(fù)緩存反模式往往發(fā)生在流量高峰時候低淡,通過線性增加機器和提高機器內(nèi)存可以大大減少系統(tǒng)崩潰的概率姓言。

緩存使用注意事項

  • 緩存對象大小限制
  • 高頻和低頻分離
  • 緩存過期時間設(shè)置
  • 防止緩存擊穿雪崩ask
  • 服務(wù)過載的cache應(yīng)對策略
  • 緩存自動加載技法 guava-cache的loading模式可以參考
  • 禁用堆外內(nèi)存
  • null值得緩存
  • 分布式換成考慮序列化和反序列化成本 & key的分布情況,不要分散到過多的節(jié)點

緩存的評審

  • 在系統(tǒng)設(shè)計階段對緩存使用進行評審
  • 在code-review階段進行緩存review

參考文字

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔗蹋,一起剝皮案震驚了整個濱河市何荚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌猪杭,老刑警劉巖餐塘,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異皂吮,居然都是意外死亡戒傻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門蜂筹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來需纳,“玉大人,你說我怎么就攤上這事艺挪〔霍妫” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長口蝠。 經(jīng)常有香客問我器钟,道長,這世上最難降的妖魔是什么亚皂? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任俱箱,我火速辦了婚禮,結(jié)果婚禮上灭必,老公的妹妹穿的比我還像新娘狞谱。我一直安慰自己,他們只是感情好禁漓,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布跟衅。 她就那樣靜靜地躺著,像睡著了一般播歼。 火紅的嫁衣襯著肌膚如雪伶跷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天秘狞,我揣著相機與錄音叭莫,去河邊找鬼。 笑死烁试,一個胖子當(dāng)著我的面吹牛雇初,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播减响,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼靖诗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了支示?” 一聲冷哼從身側(cè)響起刊橘,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颂鸿,沒想到半個月后促绵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡嘴纺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年败晴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颖医。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡位衩,死狀恐怖裆蒸,靈堂內(nèi)的尸體忽然破棺而出熔萧,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布佛致,位于F島的核電站贮缕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏俺榆。R本人自食惡果不足惜感昼,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望罐脊。 院中可真熱鬧定嗓,春花似錦、人聲如沸萍桌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽上炎。三九已至恃逻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間藕施,已是汗流浹背寇损。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留裳食,地道東北人矛市。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像胞谈,于是被迫代替她去往敵國和親尘盼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

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