筆記
緩存就是為了彌補(bǔ)存儲系統(tǒng)在這些復(fù)雜業(yè)務(wù)場景下的不足状勤,其基本原理是將可能重復(fù)使用的數(shù)據(jù)放到內(nèi)存中吴侦,一次生成挖胃、多次使用杂靶,避免每次使用都去訪問存儲系統(tǒng)。緩存能夠帶來性能的大幅提升酱鸭。
-
緩存的架構(gòu)設(shè)計要點:
-
緩存穿透
緩存穿透是指緩存沒有發(fā)揮作用吗垮,業(yè)務(wù)系統(tǒng)雖然去緩存查詢數(shù)據(jù),但緩存中沒有數(shù)據(jù)凹髓,業(yè)務(wù)系統(tǒng)需要再次去存儲系統(tǒng)查詢數(shù)據(jù)烁登。通常情況下有兩種情況:- 存儲數(shù)據(jù)不存在
如果查詢存儲系統(tǒng)的數(shù)據(jù)沒有找到,則直接設(shè)置一個默認(rèn)值(可以是空值蔚舀,也可以是具體的值)存到緩存中饵沧,這樣第二次讀取緩存時就會獲取到默認(rèn)值,而不會繼續(xù)訪問存儲系統(tǒng)赌躺。 - 緩存數(shù)據(jù)生成耗費大量時間或者資源
存儲系統(tǒng)中存在數(shù)據(jù)狼牺,但生成緩存數(shù)據(jù)需要耗費較長時間或者耗費大量資源。如果剛好在業(yè)務(wù)訪問的時候緩存失效了礼患,那么也會出現(xiàn)緩存沒有發(fā)揮作用是钥,訪問壓力全部集中在存儲系統(tǒng)上的情況。
- 存儲數(shù)據(jù)不存在
-
緩存雪崩
緩存雪崩是指當(dāng)緩存失效(過期)后引起系統(tǒng)性能急劇下降的情況讶泰。緩存雪崩的常見解決方法有兩種:更新鎖機(jī)制和后臺更新機(jī)制咏瑟。- 更新鎖機(jī)制 對緩存更新操作進(jìn)行加鎖保護(hù),保證只有一個線程能夠進(jìn)行緩存更新痪署,未能獲取更新鎖的線程要么等待鎖釋放后重新讀取緩存码泞,要么就返回空值或者默認(rèn)值。分布式集群的業(yè)務(wù)系統(tǒng)要實現(xiàn)更新鎖機(jī)制狼犯,需要用到分布式鎖余寥,如 ZooKeeper。
- 后臺更新機(jī)制 由后臺線程來更新緩存悯森,而不是由業(yè)務(wù)線程來更新緩存宋舷,緩存本身的有效期設(shè)置為永久,后臺線程定時更新緩存瓢姻。
-
緩存熱點
- 緩存熱點的解決方案就是復(fù)制多份緩存副本祝蝠,將請求分散到多個緩存服務(wù)器上,減輕緩存熱點導(dǎo)致的單臺緩存服務(wù)器壓力。
- 同的緩存副本不要設(shè)置統(tǒng)一的過期時間绎狭,否則就會出現(xiàn)所有緩存副本同時生成同時失效的情況细溅,從而引發(fā)緩存雪崩效應(yīng)。
-
由于緩存的各種訪問策略和存儲的訪問策略是相關(guān)的儡嘶,因此上面的各種緩存設(shè)計方案通常情況下都是集成在存儲訪問方案中喇聊,可以采用“程序代碼實現(xiàn)”的中間層方式,也可以采用獨立的中間件來實現(xiàn)蹦狂。
理解與思考
緩存很有用誓篱。軟件系統(tǒng)中隨處可見各種緩存。硬件凯楔,操作系統(tǒng)窜骄,數(shù)據(jù)庫,web系統(tǒng)中都能看到緩存的應(yīng)用啼辣。
制定緩存和失效的策略啊研,是個技術(shù)活御滩,也是用好緩存系統(tǒng)的關(guān)鍵鸥拧。稍有不慎就自廢武功。
課后習(xí)題
分享一下你所在的業(yè)務(wù)發(fā)生過哪些因為緩存導(dǎo)致的線上問題削解?采取了什么樣的解決方案富弦?效果如何?
我目前做的系統(tǒng)氛驮,是一個性能報表系統(tǒng)腕柜,并發(fā)用戶數(shù)少,網(wǎng)絡(luò)上處于用戶的內(nèi)網(wǎng)系統(tǒng)矫废,注重數(shù)據(jù)的時效性盏缤,需要及時刷新,所以沒用使用緩存蓖扑。對緩存系統(tǒng)的設(shè)計和使用都比較少唉铜。