Redis的布隆過濾器、單線程架構、雙寫一致性、比較穿透、擊穿及雪崩、緩存更新方案及分布式鎖。
1 布隆過濾器
是一種高效的概率型數據結構,用于判斷元素是否存在。主要用于防止緩存穿透,通過攔截不存在的數據查詢,避免擊穿數據庫。
原理:元素通過多個哈希函數映射到位數組的多個位置,添加元素時,將對應位設為1;查詢時,若所有位均為1,則元素可能存在,否則必然不存在。
2 單線程架構
Redis?使用單線程來處理所有客戶端的請求。實現原理:
- 事件監聽與處理。客戶端發起的請求會被加入到事件隊列中。Redis根據事件順序來解析及執行命令。
- 非阻塞I/O。通過多路復用技術,異步處理請求,避免阻塞。
優勢:
- 天然避免并發問題。避免來線程開銷。
- Redis基于內存處理,速度極快,單線程足以處理龐大請求量。
3 雙寫一致性
同時操作Redis緩存和后段數據庫(如MySql)時,確保兩者的數據一致。
并發場景下的一致性問題:
- 多個線程同時修改數據,可能會導致緩存與數據庫不一致。
- 緩存過期后,重建緩存時可能因為并發請求導致臟數據。
1 旁路緩存模式
寫入:1)先更新數據庫;2)再刪除緩存。
讀取:1)先讀緩存,命中則返回。2)為命中則讀數據庫,寫入緩存后返回。
缺陷:1)刪除緩存后到下次加載前存在短暫不一致窗口。2)高并發下可能觸發緩存擊穿。
2 延遲雙刪
寫入:1)先刪除緩存;2)更新數據庫。3)延遲一定時間(如500ms)后再刪除緩存。
第二次刪除清除的是在“更新數據庫”期間可能存在的舊緩存。
3 分布式鎖強一致性
寫入:1)獲取分布式鎖;2)更新數據庫;3)更新/刪除緩存;4)釋放鎖。
優點:強一致性,避免并發寫入沖突。
缺陷:鎖競爭可能降低性能。
4 緩存穿透、擊穿及雪崩問題
穿透 | 大量請求查詢緩存中不存在的數據,導致請求繞過緩存直接訪問數據庫。 解決方案:1)布隆過濾器。2)緩存空值,對查詢結果為空的Key,緩存短時間(如5分鐘)的空值。3)接口層校驗,對請求參數合法性進行校驗。 |
擊穿 | 某個熱點Key突然過期,大量并發請求同時涌入,Redis需要同時重建緩存。導致Redis瞬時壓力過大,可能引發雪崩效應。 解決方案:1)使用分布鎖,確保只有一個線程重建緩存,其他線程等待。2)熱點Key永不過期,通過異步任務定期更新。 |
雪崩 | 大量Key同時過期或Redis集群宕機,導致所有請求直接訪問數據庫。 解決方案:1)隨機過期時間,分散Key的過期時間。2)Redis集群高可用,避免單點故障。 |
表 緩存穿透、擊穿及雪崩問題