開發人員使用「快取+過期時間」的策略既可以加速資料讀寫,又保證資料的定期更新,這種模式基本能夠滿足絕大部分需求。但是有兩個問題如果同時出現,可能就會對應用造成致命的危害:
在快取失效的瞬間,有大量執行緒來重建快取,造成後端負載過大,甚至可能會讓應用崩潰。
互斥鎖(mutex key)
此方法只允許乙個執行緒重建快取,其他執行緒等待重建快取的執行緒執行完,重新從快取獲取資料即可。
下面**使用redis的setnx命令實現上述功能:
string get (string key)
// 其他執行緒休息50毫秒後重試
else
}return value;
}
1)從redis獲取資料,如果值不為空,則直接返回值;否則執行下面的2.1)和2.2)步驟。
2.1)如果set(nx和ex)結果為true,說明此時已經有其他執行緒正在執行構建快取的工作,那麼當前執行緒將休息指定時間(例如這裡是50毫秒,取決於構建快取的速度)後,重新執行函式,直到獲取到資料。
永遠不過期
「永遠不過期」包含兩層意思
從實戰看,此方法有效杜絕了熱點key產生的問題,但唯一不足的就是重構快取期間,會出現資料不一致的情況,這取決於應用方是否容忍這種不一致。下面**使用使用redis進行模擬:
string get (final string key)
});}
}return value;
}
作為乙個併發量較大的應用,在使用快取時有三個目標:第一,加快使用者訪問速度,提高使用者體驗。第二,降低後端負載,減少潛在風險。第三,保證資料「盡可能」及時更新。下面將按照這三個維度對上述解決方案進行分析。
下面是兩種解決方法的對比:
解決方案
優點缺點
簡單分布式鎖
1.思路簡單。2.保證一致性
「永遠不過期」
基本杜絕熱點key問題
1.不保證一致性。2.邏輯過期時間增加**維護成本和記憶體成本。
Redis學習之熱點key重建
在redis的生產環境中,大量客戶端連線請求某乙個key,但都需要從db中獲取資料,來回寫資料庫,如下圖 造成的問題 大量的執行緒請求資料庫,造成資料庫壓力,還有就是請求會變慢。解決辦法 在快取層面做乙個互斥鎖,達到只有單個執行緒來更新資料的目的,但是響應還是很慢,只是db壓力減輕 還可能因為操作不...
Redis熱點大Key的優化過程
對於電商 中,我們經常可以會遇到熱門商品的搶購或者秒殺場景以及事先經過廣告投放等措施進行定向引流,這樣就會導致某個熱賣商品在短時間內湧入大量流量。比如,雙十一期間某些熱門商品的降價 當這其中的某一件商品被數萬次點選瀏覽或者購買時,會形成乙個較大的需求量,這種情況下就會造成熱點問題。熱點key產生問題...
Redis雪崩 穿透 熱點key等優化
請求cache拿不到資料,就會去儲存層拿,會一直請求資料。導致後端打崩。1.快取層快取空值,增加過期時間 2.布隆過濾器 快取雪崩就是指快取由於某些原因,整體crash掉了,導致大量請求到達後端資料庫,從而導致資料庫崩潰。如 1.某個時間點內,系統預載入的快取週期性集中失效了 設定快取n 隨機數過期...