分布式鎖redisson
- 加鎖流程
- 緩存相關問題
加鎖流程
- redisson底層通過lua腳本實現加鎖的原子性
- lock動作包含:加鎖、設置超時時間、鎖續命
- 未獲取到鎖的線程通過獲取信號量許可等待,所釋放后釋放信號量通知等待線程
緩存相關問題
- 緩存失效(擊穿):由于大批量緩存在同一時間失效可能導致大量請求同時穿透緩存直達數據庫,可能會造成數據庫瞬間壓力過大甚至掛掉,對于這種情況我們在批量增加緩存時最好將這一批數據的緩存過期時間設置為一個時間段內的不同時間。
- 緩存穿透:緩存穿透是指查詢一個根本不存在的數據,緩存層和存儲層都不會命中,通常出于容錯的考慮,如果從存儲層查不到數據則不寫入緩存層。緩存穿透將導致不存在的數據每次請求都要到存儲層去查詢,失去了緩存保護后端存儲的意義。
解決方案:1 緩存空值 2 布隆過濾器 - 緩存雪崩:緩存雪崩指的是緩存層支撐不住或宕掉后,流量會像奔逃的野牛一樣,打向后端存儲層。存儲層的調用量會暴增,造成存儲層也會級聯宕機的情況。
解決方案:限流降級 - 熱點key緩存重建:當前key是一個熱點key,并發量非常大。在緩存失效的瞬間,有大量線程來重建緩存,造成后端負載加大,甚至可能會讓應用崩潰。
解決方案:互斥鎖,此方法只允許一個線程重建緩存,其他線程等待重建緩存的線程執行完,重新從緩存獲取數據即可。 - 緩存與數據庫雙寫一致性:在大并發下,同時操作數據庫與緩存會存在數據不一致性問題。
解決方法:可以通過加分布式讀寫鎖保證并發讀寫或寫寫的時候按順序排好隊,讀讀的
時候相當于無鎖。適用于讀多寫少的情況。