筆記
緩存就是為了彌補(bǔ)存儲(chǔ)系統(tǒng)在這些復(fù)雜業(yè)務(wù)場(chǎng)景下的不足,其基本原理是將可能重復(fù)使用的數(shù)據(jù)放到內(nèi)存中,一次生成、多次使用,避免每次使用都去訪問(wèn)存儲(chǔ)系統(tǒng)。緩存能夠帶來(lái)性能的大幅提升。
-
緩存的架構(gòu)設(shè)計(jì)要點(diǎn):
-
緩存穿透
緩存穿透是指緩存沒(méi)有發(fā)揮作用,業(yè)務(wù)系統(tǒng)雖然去緩存查詢(xún)數(shù)據(jù),但緩存中沒(méi)有數(shù)據(jù),業(yè)務(wù)系統(tǒng)需要再次去存儲(chǔ)系統(tǒng)查詢(xún)數(shù)據(jù)。通常情況下有兩種情況:- 存儲(chǔ)數(shù)據(jù)不存在
如果查詢(xún)存儲(chǔ)系統(tǒng)的數(shù)據(jù)沒(méi)有找到,則直接設(shè)置一個(gè)默認(rèn)值(可以是空值,也可以是具體的值)存到緩存中,這樣第二次讀取緩存時(shí)就會(huì)獲取到默認(rèn)值,而不會(huì)繼續(xù)訪問(wèn)存儲(chǔ)系統(tǒng)。 - 緩存數(shù)據(jù)生成耗費(fèi)大量時(shí)間或者資源
存儲(chǔ)系統(tǒng)中存在數(shù)據(jù),但生成緩存數(shù)據(jù)需要耗費(fèi)較長(zhǎng)時(shí)間或者耗費(fèi)大量資源。如果剛好在業(yè)務(wù)訪問(wèn)的時(shí)候緩存失效了,那么也會(huì)出現(xiàn)緩存沒(méi)有發(fā)揮作用,訪問(wèn)壓力全部集中在存儲(chǔ)系統(tǒng)上的情況。
- 存儲(chǔ)數(shù)據(jù)不存在
-
緩存雪崩
緩存雪崩是指當(dāng)緩存失效(過(guò)期)后引起系統(tǒng)性能急劇下降的情況。緩存雪崩的常見(jiàn)解決方法有兩種:更新鎖機(jī)制和后臺(tái)更新機(jī)制。- 更新鎖機(jī)制 對(duì)緩存更新操作進(jìn)行加鎖保護(hù),保證只有一個(gè)線程能夠進(jìn)行緩存更新,未能獲取更新鎖的線程要么等待鎖釋放后重新讀取緩存,要么就返回空值或者默認(rèn)值。分布式集群的業(yè)務(wù)系統(tǒng)要實(shí)現(xiàn)更新鎖機(jī)制,需要用到分布式鎖,如 ZooKeeper。
- 后臺(tái)更新機(jī)制 由后臺(tái)線程來(lái)更新緩存,而不是由業(yè)務(wù)線程來(lái)更新緩存,緩存本身的有效期設(shè)置為永久,后臺(tái)線程定時(shí)更新緩存。
-
緩存熱點(diǎn)
- 緩存熱點(diǎn)的解決方案就是復(fù)制多份緩存副本,將請(qǐng)求分散到多個(gè)緩存服務(wù)器上,減輕緩存熱點(diǎn)導(dǎo)致的單臺(tái)緩存服務(wù)器壓力。
- 同的緩存副本不要設(shè)置統(tǒng)一的過(guò)期時(shí)間,否則就會(huì)出現(xiàn)所有緩存副本同時(shí)生成同時(shí)失效的情況,從而引發(fā)緩存雪崩效應(yīng)。
-
由于緩存的各種訪問(wèn)策略和存儲(chǔ)的訪問(wèn)策略是相關(guān)的,因此上面的各種緩存設(shè)計(jì)方案通常情況下都是集成在存儲(chǔ)訪問(wèn)方案中,可以采用“程序代碼實(shí)現(xiàn)”的中間層方式,也可以采用獨(dú)立的中間件來(lái)實(shí)現(xiàn)。
理解與思考
緩存很有用。軟件系統(tǒng)中隨處可見(jiàn)各種緩存。硬件,操作系統(tǒng),數(shù)據(jù)庫(kù),web系統(tǒng)中都能看到緩存的應(yīng)用。
制定緩存和失效的策略,是個(gè)技術(shù)活,也是用好緩存系統(tǒng)的關(guān)鍵。稍有不慎就自廢武功。
課后習(xí)題
分享一下你所在的業(yè)務(wù)發(fā)生過(guò)哪些因?yàn)榫彺鎸?dǎo)致的線上問(wèn)題?采取了什么樣的解決方案?效果如何?
我目前做的系統(tǒng),是一個(gè)性能報(bào)表系統(tǒng),并發(fā)用戶(hù)數(shù)少,網(wǎng)絡(luò)上處于用戶(hù)的內(nèi)網(wǎng)系統(tǒng),注重?cái)?shù)據(jù)的時(shí)效性,需要及時(shí)刷新,所以沒(méi)用使用緩存。對(duì)緩存系統(tǒng)的設(shè)計(jì)和使用都比較少。