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