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