回覆列表
  • 1 # java架構設計

    如何最佳化快取中百萬級併發的KEY,其實就是如何應對快取中的熱key問題,也是面試中大家經常被問到的一道面試題。大家在網上可以搜尋“redis熱key問題”便可以看到很多關於這方面的解答。

    問題背景

    我們正常使用redis,最簡單的方案就是先從redis查詢某個key,key不在的時候就去資料庫查詢,資料庫查詢到資料後,返回的同時將資料載入到redis中,下次同樣的訪問請求直接從redis獲取就可以了,請求流程圖如下:

    這樣的方式在量不大的時候都沒有問題,但是如果量大了就有問題了,潛在的問題有:

    快取穿透:redis不存在,資料庫也沒有,每次請求都走資料庫了,資料庫承載所有請求壓力,嚴重導致資料庫宕機。

    快取雪崩:同一個時間段內,大量快取過期,導致所有請求同時懟到db上,db無法承載,導致宕機。

    redis熱key問題:大量請求都只請求一個特定的key,導致單臺redis流量承載超過頻寬上限和I/O負載極限,最終導致redis無法響應,redis無法響應會直接導致所有請求失敗或者請求到資料庫伺服器,最終資料庫宕機。

    如何發現熱點key

    這個其實還是比較簡單的,大家都能想到一些方案,比如有的業務天生就帶有高併發屬性,那麼你在做方案設計的時候就要考慮熱點key的問題,比如商品的秒殺業務。

    研發資源比較充足的公司通常都會做一套健全的機制去發現熱key,發現之後再根據熱key的等級做相應的處理方案。大家也可以自己想想,如果讓你來設計這個熱key發現機制你會用什麼方案?

    aop統計、nginx閘道器統計、實時計算統計-->告警-->處理方案

    解決方案

    瞭解到了問題產生的原因和背景之後,相信大家或多或少都有一些自己的解決方案,我主推:

    JVM快取:直接將redis的熱key載入的jvm記憶體中,多臺叢集伺服器下,每臺伺服器都會有這個記憶體快取,只要伺服器能承載住所有請求,這個熱key就沒問題。這種方案最簡單!最直接!最有效!

    當然這會有一些問題,比如快取的一致性無法保證,需要看具體的業務場景考慮是否適合使用,或者自己開發一套滿足快取資料一致性的機制。

    如果jvm快取都不能滿足你的業務量請求,那麼這是不存在的!

    現成的方案:《有贊透明多級快取解決方案(TMC)》

    連結:https://segmentfault.com/a/1190000017142556#articleHeader4

  • 中秋節和大豐收的關聯?
  • 你認為喜歡炒作的人都有什麼特點?