程序員誤區(qū),緩存一定能提升程序效率么?
大家好,今天我們來(lái)簡(jiǎn)單的聊一聊緩存問(wèn)題。什么是緩存呢?它在系統(tǒng)設(shè)計(jì)中是在一個(gè)怎么樣的位置呢?假設(shè)在一個(gè)計(jì)算機(jī)應(yīng)用里面,我們一般會(huì)把數(shù)據(jù)存放在數(shù)據(jù)庫(kù)中,一般數(shù)據(jù)庫(kù)的數(shù)據(jù)也是放在硬盤當(dāng)中,硬盤的讀寫速度畢竟有限,當(dāng)存在一些數(shù)據(jù)特別熱的時(shí)候,例如12306,查詢北京到廣州有那些車次,這個(gè)數(shù)據(jù)經(jīng)常被用戶訪問(wèn),所以我們可以把它存放在速度更快地內(nèi)存上。
緩存的本質(zhì),是為了解決不同的存儲(chǔ)介質(zhì)的速度差異問(wèn)題。是一個(gè)經(jīng)典的空間換時(shí)間的解決方案。也就是說(shuō),使用緩存就是為了讓系統(tǒng)更快。不過(guò)這也是需要有前提的,如果你的業(yè)務(wù)是讀多寫少,例如電商系統(tǒng)中的商品系統(tǒng),商品的描述與商品的屬性,都是非常典型的多讀少寫的場(chǎng)景。
一、那么緩存就一定是好東西么?緩存會(huì)不會(huì)帶來(lái)一定的副作用。答案是肯定的。首先,緩存可能并不會(huì)讓你的程序變得更快,相反,可能還會(huì)變得更慢。因?yàn)樵L問(wèn)內(nèi)存雖然說(shuō)非常地快,但是多少也是要開銷的,特別是當(dāng)你的緩存不是本機(jī)而是分布式的時(shí)候,至少需要一個(gè)網(wǎng)絡(luò)的RT。所以,如果你的緩存的命中率非常地低,那么,緩存的效果就會(huì)大打折扣,不僅沒(méi)有加快程序的訪問(wèn)速度,還會(huì)讓程序變得更慢。
二、其次,緩存可能會(huì)讓你讀到錯(cuò)誤的數(shù)據(jù),更官方一點(diǎn)的回答,就是數(shù)據(jù)的一致性會(huì)下降。造成這種數(shù)據(jù)的主要原因,就是緩存的操作無(wú)法保證100%成功。比方說(shuō),我們?cè)诰S護(hù)一個(gè)電商系統(tǒng),原本華為Mate30Pro售價(jià)為6999元,后來(lái)你決定開展一次促銷活動(dòng),將價(jià)格變更為6699元,當(dāng)你設(shè)置完新的價(jià)格之后,數(shù)據(jù)庫(kù)已經(jīng)更新了,但是緩存可能還是舊的,更要命的,如果你使用的是本機(jī)緩存,那么可能部分機(jī)器上更新成功,部分機(jī)器更新失敗,導(dǎo)致用戶可能進(jìn)入不同頁(yè)面的時(shí)候,看到不同的價(jià)格,從而引發(fā)用戶投訴,所以,當(dāng)我們使用緩存的時(shí)候,通常會(huì)設(shè)置一個(gè)過(guò)期時(shí)間,從而減少緩存失效帶來(lái)的影響。
三、最后,緩存可能會(huì)帶來(lái)運(yùn)維上的麻煩,如果不使用緩存,當(dāng)我們?cè)陧?yè)面或者APP上面看到數(shù)據(jù)錯(cuò)誤,那么一般都是數(shù)據(jù)庫(kù)的問(wèn)題,但是引進(jìn)了緩存之后,我們就需要增加一個(gè)工序去排查是否是緩存的問(wèn)題,如果緩存是本機(jī)的,那么可能是部分機(jī)器存在問(wèn)題,部分機(jī)器是好的,這就給我們排查增加了不少的難度,如果緩存是分布式的,同樣也有可能存在不一致的問(wèn)題,同時(shí)緩存機(jī)器的帶寬、內(nèi)存等等都需要不少的運(yùn)維成本。
總體來(lái)說(shuō),緩存也是一把雙刃劍,需要我們對(duì)業(yè)務(wù)場(chǎng)景進(jìn)行甄別,合理地選擇合適的緩存,才能夠發(fā)揮出緩存的最大作用。歡迎大家關(guān)注我,共同學(xué)習(xí),共同進(jìn)步。大家的支持是我繼續(xù)嘮嗑的動(dòng)力。