對於電商**中,我們經常可以會遇到熱門商品的搶購或者秒殺場景以及事先經過廣告投放等措施進行定向引流,這樣就會導致某個熱賣商品在短時間內湧入大量流量。
比如,雙十一期間某些熱門商品的降價**,當這其中的某一件商品被數萬次點選瀏覽或者購買時,會形成乙個較大的需求量,這種情況下就會造成熱點問題。
熱點key產生問題的原因
請求到的分片過於集中,超過單台server的效能極限。
在服務端讀資料進行訪問時,往往會對資料進行分片切分。此過程中會在某一主機server上對相應的key進行訪問,當訪問超過server極限時,就會導致熱點 key 問題的產生。
熱點key的危害
解決方式
redis使用過程中經常會有各種大key的情況, 比如單個簡單的key儲存的value很大。
由於redis是單執行緒執行的,如果一次操作的value很大會對整個redis的響應時間造成負面影響,導致io網路擁塞。
將整存整取的大物件,分拆為多個小物件。可以嘗試將物件分拆成幾個key-value, 使用multiget獲取值,這樣分拆的意義在於分拆單次操作的壓力,將操作壓力平攤到多個redis例項中,降低對單個redis的io影響;
在電商**的一次營銷事件中,通過相關的引流操作,將大量流量在指定時間引流到了商品搶購頁面,在搶購頁中涉及到的幾個後台介面,其中有一兩個都會去查商品資訊。
在商品模組對外暴露了乙個對條件查詢的介面,在上述的場景下就會短時間高頻次的呼叫這個介面。
根據這個場景發現,商品資料,在活動期間會有很大的訪問量,這是乙個熱點key。另外由於前期錯誤的設定導致了這個熱點key又是乙個大key。
所以我們的優化過程就是按照如果解決掉熱點key和大key的這兩個問題進行的。之前並沒有上述的概念,都是摸著石頭過河,漸漸地思路才清晰起來。
直接按條件查詢資料庫。
public listversion1(querycriteriondto querydto)
將全量資料快取到redis中,查出資料後再進行過濾返回。
public listversion2(querycriteriondto querydto)
仍然將全量資料快取到redis中,但是只快取必要的資料,比如過濾條件,從快取中拿出全部的資料後,進行過濾後列出需要返回的物件唯一id,再根據這一批唯一id去快取中查單個的物件出來,最後拼成list返回。
public listversion3(querycriteriondto querydto)
將每次的獲取單個物件的get操作,調整成mget這樣就可以一次操作取出多個物件出來,然後再跟查詢的keys比較一下size,如果少的話,再嘗試從庫中查一次,把少的資料補上。
public listversion4(querycriteriondto querydto)
熱點key重建優化
開發人員使用 快取 過期時間 的策略既可以加速資料讀寫,又保證資料的定期更新,這種模式基本能夠滿足絕大部分需求。但是有兩個問題如果同時出現,可能就會對應用造成致命的危害 在快取失效的瞬間,有大量執行緒來重建快取,造成後端負載過大,甚至可能會讓應用崩潰。互斥鎖 mutex key 此方法只允許乙個執行...
Redis雪崩 穿透 熱點key等優化
請求cache拿不到資料,就會去儲存層拿,會一直請求資料。導致後端打崩。1.快取層快取空值,增加過期時間 2.布隆過濾器 快取雪崩就是指快取由於某些原因,整體crash掉了,導致大量請求到達後端資料庫,從而導致資料庫崩潰。如 1.某個時間點內,系統預載入的快取週期性集中失效了 設定快取n 隨機數過期...
Redis學習之熱點key重建
在redis的生產環境中,大量客戶端連線請求某乙個key,但都需要從db中獲取資料,來回寫資料庫,如下圖 造成的問題 大量的執行緒請求資料庫,造成資料庫壓力,還有就是請求會變慢。解決辦法 在快取層面做乙個互斥鎖,達到只有單個執行緒來更新資料的目的,但是響應還是很慢,只是db壓力減輕 還可能因為操作不...