網(wǎng)站性能優(yōu)化緩存優(yōu)化
分布式緩存
回顧網(wǎng)站架構(gòu)演化歷程,當(dāng)網(wǎng)站遇到性能瓶頸時(shí),第一個(gè)想到的解決方案就是使用緩存。在整個(gè)網(wǎng)站應(yīng)用中,緩存幾乎無(wú)所不在,既存在于瀏覽器,也存在于應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器;既可以對(duì)數(shù)據(jù)緩存,也可以對(duì)文件緩存,還可以對(duì)頁(yè)面片段緩存。合理使用緩存,對(duì)網(wǎng)站性能優(yōu)化意義重大。
網(wǎng)站性能優(yōu)化第一定律:優(yōu)先考慮使用緩存優(yōu)化性能。
緩存的基本原理
緩存指將數(shù)據(jù)存儲(chǔ)在相對(duì)較高訪問(wèn)速度的存儲(chǔ)介質(zhì)中,以供系統(tǒng)處理。一方面緩存訪問(wèn)速度快,可以減少數(shù)據(jù)訪問(wèn)的時(shí)間,另一方面如果緩存的數(shù)據(jù)是經(jīng)過(guò)計(jì)算處理得到的,那么被緩存的數(shù)據(jù)無(wú)需重復(fù)計(jì)算即可直接使用,因此緩存還起到減少計(jì)算時(shí)間的作用。
網(wǎng)站數(shù)據(jù)訪問(wèn)通常遵循二八定律,即80%的訪問(wèn)落在20%的數(shù)據(jù)上,因此利用Hash表和內(nèi)存的高速訪問(wèn)特性,將這20%的數(shù)據(jù)緩存起來(lái),可很好地改善系統(tǒng)性能,提高數(shù)據(jù)讀取速度,降低存儲(chǔ)訪問(wèn)壓力。
合理使用緩存
使用緩存對(duì)提高系統(tǒng)性能有很多好處,但是不合理使用緩存非怛不能提高系統(tǒng)的性能,還會(huì)成為系統(tǒng)的累贅,甚至風(fēng)險(xiǎn)。實(shí)踐中,緩存濫用的情景屢見(jiàn)不鮮——過(guò)分依賴低可用的緩存系統(tǒng)、不恰當(dāng)?shù)厥褂镁彺娴臄?shù)據(jù)訪問(wèn)特性等。
頻繁修改的數(shù)據(jù)
如采緩存中保存的是頻繁修改的數(shù)據(jù),就會(huì)出現(xiàn)數(shù)據(jù)寫(xiě)入緩存后,應(yīng)用還來(lái)+及讀取緩存,數(shù)據(jù)就已失效的情形,徒增系統(tǒng)負(fù)擔(dān)。一般說(shuō)來(lái),數(shù)據(jù)的讀寫(xiě)比在2:1以上,即寫(xiě)入一次緩存,在數(shù)據(jù)更新前至少讀取兩次,緩存才有意義。實(shí)踐中,這個(gè)讀寫(xiě)比通常非常高,比如新浪微博的熱門(mén)微博,緩存以后可能會(huì)被讀取數(shù)百萬(wàn)次。
沒(méi)有熱點(diǎn)的訪問(wèn)
緩存使用內(nèi)存作為存儲(chǔ),內(nèi)存資源寶貴而冇限,不可能將所有數(shù)據(jù)都緩存起來(lái),只能將最新訪問(wèn)的數(shù)據(jù)緩存起來(lái),而將歷史數(shù)據(jù)淸理出緩存。如果應(yīng)用系統(tǒng)訪問(wèn)數(shù)據(jù)沒(méi)有熱點(diǎn),不遵循二八定律,即大部分?jǐn)?shù)據(jù)訪問(wèn)并沒(méi)有集中在小部分?jǐn)?shù)據(jù)上,那么緩存就沒(méi)有意義,因?yàn)榇蟛糠謹(jǐn)?shù)據(jù)還沒(méi)有被再次訪問(wèn)就已經(jīng)被擠出緩存了。
數(shù)據(jù)不一致與臟讀
一般會(huì)對(duì)緩存的數(shù)據(jù)設(shè)S失效時(shí)間,一□超過(guò)失效時(shí)間,就要從數(shù)據(jù)庫(kù)中重新加載。因此應(yīng)用要容忍一定時(shí)間的數(shù)據(jù)不一致,如賣(mài)家已經(jīng)編輯了商品厲性,但是需要過(guò)一段時(shí)間才能被買(mǎi)家吞到。在互聯(lián)網(wǎng)應(yīng)用中,這種延遲通常是可以接受的,但是具體應(yīng)用仍需憤重對(duì)待。還有一種策略娃數(shù)據(jù)更新時(shí)立即更新緩存,不過(guò)這也會(huì)帶來(lái)更多系統(tǒng)開(kāi)銷(xiāo)和單務(wù)一致性的問(wèn)題。
緩存可用性
緩存是為提高數(shù)據(jù)讀取性能的,緩存數(shù)據(jù)丟失或者緩存不可用不會(huì)影響到應(yīng)用程序的處理——它可以從數(shù)據(jù)庫(kù)貞接獲取數(shù)據(jù)。但是隨著業(yè)務(wù)的發(fā)展,緩存會(huì)承擔(dān)大部分?jǐn)?shù)
大型網(wǎng)站技術(shù)架構(gòu)核心原理與案例分析
據(jù)訪問(wèn)的壓力,數(shù)據(jù)庫(kù)已經(jīng)習(xí)慣了有緩存的日子,所以當(dāng)緩存服務(wù)崩潰時(shí),數(shù)據(jù)庫(kù)會(huì)因?yàn)橥耆荒艹惺苋绱舜蟮膲毫Χ礄C(jī),進(jìn)而導(dǎo)致整個(gè)網(wǎng)站不可用。這種情況被稱(chēng)作緩存雪崩,發(fā)生這種故障,甚至不能簡(jiǎn)單地重啟緩存服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器來(lái)恢復(fù)網(wǎng)站訪問(wèn)。
實(shí)踐中,有的網(wǎng)站通過(guò)緩存熱備等手段提高緩存可用性:當(dāng)某臺(tái)緩存服務(wù)器宕機(jī)時(shí),將緩存訪問(wèn)切換到熱備服務(wù)器上。但是這種設(shè)計(jì)顯然有違緩存的初衷,緩存根本就不應(yīng)該被當(dāng)做一個(gè)可靠的數(shù)據(jù)源來(lái)使用。
通過(guò)分布式緩存服務(wù)器集群,將緩存數(shù)據(jù)分布到集群多臺(tái)服務(wù)器上可在一定程度上改善緩存的可用性。當(dāng)一臺(tái)緩存服務(wù)器宕機(jī)的時(shí)候,只有部分緩存數(shù)據(jù)丟失,重新從數(shù)據(jù)庫(kù)加載這部分?jǐn)?shù)據(jù)不會(huì)對(duì)數(shù)據(jù)庫(kù)產(chǎn)生很大影響。