什麼是緩存擊穿
所謂的緩存擊穿,就是我們對於熱點數據設置緩存時,對於這些key的過期策略考慮欠缺,而導致某個熱點key過期時大量的請求瞬間穿透到數據庫層,造成DB負載飆升,甚至服務器宕機的情況。
這裡針對的主要是單個key的情況,對於批量key過期策略不當造成的問題通常被稱之為緩存雪崩。它們二者之間十分相似卻又有所不同,這裡我們主要說說擊穿的情況,有興趣的可以再去深入瞭解。
過程:
原先熱點key中的數據不需要去查詢DB,流程是這樣的:
某個key過期時候,如果處理不當,就變為以下這樣:
如果過期瞬間的併發量很大,那麼問題就出現了。
常見場景
商城經常會有搶購、秒殺一類的活動,參加活動的商品數據會被緩存起來,又比如運營人員發表的某篇文章、某張圖片,這些都有可能成為熱點數據,也都會被緩存起來。
解決方案
1.多個熱點key的緩存過期時間應該被均勻錯開;
2.重新設計緩衝過期方式,讓其永遠不會自動過期,這裡的不過期並非真的不過期,而是配合使用分佈式鎖,當數據緩存超過一定時間之後,只有取得鎖的請求允許重建緩存,其餘均返回舊數據。
ps:關於如何使用Redis實現分佈式鎖,之前我們已經介紹過,還不清楚的小夥伴記得等會翻回去看看。
其他問題
除了上面緩存過期的問題,在超高併發的環境中,我們可能還會遇到以下的問題,這些問題留給大家自行探索,:
單個value的大小造成的網絡阻塞;
-
如何避免因出現單機熱點,熱點key都落到同一臺機子上面。
當然了,也歡迎大家在評論區一起進行探討!
閱讀更多 架構之美 的文章