閱讀文本大概需要3分鐘。
2019磕磕碰碰總算過去了,2020年秉承開源共享原則,繼續分享在工作中遇到的各種問題和幹貨。2020年在面試題開始,祝願小夥伴在2020年都能謀到一份好差事。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLi0zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwkzX39GZhh2csATMflHLwEzX4xSZz91ZsADMx8FdsYkRGZkRG9lcvx2bjxSa2EWNhJTW1AlUxEFeVRUUfRHelRHL2EzXlpXazxyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3PnVGcq5yYjVWOjJmNzcTNyE2YzMzN4QzNxY2M0UDN5kTZ2ATYm9CX1AzLcdDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL5M3Lc9CX6MHc0RHaiojIsJye.jpeg)
0x01:緩存穿透
在高并發情況下,查詢一個資料庫和緩存都不存在的值時;如果緩存服務不對這個不存在的值進行緩存,導緻緩存不會被命中,而大量請求直接落到資料庫上。這種情況就叫緩存擊穿。這種情況就是緩存和資料庫都沒有響應的值。
解決方案:
- 緩存的key要按一定規則生成,然後集中攔截所有請求緩存的Key,如果請求的Key不滿足既定的生成規則,就拒絕通路。
- 對于NULL值,也直接緩存,但是緩存NULL的時間不能太長,否則NULL資料長時間得不到更新,也不能太短,否則達不到防止緩存擊穿的效果
0x02:緩存擊穿
在高并發情況下,對一個特定的值進行查詢,但是這個時候緩存正好過期了,緩存沒有命中,而導緻大量請求直接通路資料庫,如活動系統裡面查詢活動資訊。這種情況就是緩存沒有對應的值,資料庫有對應的值。
- 設定熱點Key對應的資料永遠不過期
- 讀取資料庫資料進行緩存時,增加互斥鎖
0x03:緩存雪崩
在高并發情況下,大量的緩存key在同一時間一起失效,導緻大量的請求在緩存中擷取不到資料,而直接通路資料庫。
- 盡量設定Key失效時間點均勻分布,即不同的Key設定不同的過期時間
- 如果緩存資料庫采用的是分布式部署,将熱點資料均勻分布在不同的緩存資料庫中
- 設定熱點資料永遠不過期