面試官提問
- redis熱點key如何解決?
- 100萬請求同時從Redis讀取相同key,如何優化?
- 明星有熱點新聞,如何從Redis讀取熱點新聞的相關數據?
Redis熱點key問題是什么
商品大促(比如阿里雙11)、熱點新聞(比如微博xx明星塌房),都很可能會訪問同一個Redis key,導致出現Redis熱點,所有的流量都打向同一臺服務器,占滿物理帶寬然后崩潰。一旦Redis崩潰,就會去訪問更慢的存儲比如數據庫,從而產生嚴重的雪崩。
如何解決Redis熱點key問題?
1、發現熱點key
(1)業務預先判斷。比如秒殺商品一定是熱點key。
(2)客戶端自動判斷。自定義客戶端SDK,然后上傳監控數據到實時分析平臺,再通過一些廣播組件比如etcd、zookeeper、kafka等廣播給所有的節點。
(3)服務端自動判斷。服務端根據請求信息,自動判斷熱點。
2、處理熱點key
(1)方式
基本上都是在做多級緩存。也就是除了Redis緩存,本地也增加幾層緩存。常見的就是Guava-Cache做本地緩存。
(2)考慮的問題
怎么保證本地緩存一致性?當value發生變化時,首先變化的那臺服務器一定是強一致性的,可以立刻invalid本地緩存。修改Redis的緩存后,一般會有廣播,廣播給所有的服務器,讓他們檢查本地緩存是否有這個熱點key,然后invalid本地緩存,保證最終一致性。
怎么保證正常業務不受影響?劃分專門的熱點區域(比如阿里Tair,有贊TMC)熱點區域的所有帶寬、存儲都是獨立的,和普通緩存區域劃分開。然后通過返回的數據熱點標記,讓客戶端下次訪問時去訪問熱點區域而非普通區域。并且當熱點區域緩存失效后,去普通區域拿數據,如果數據仍然很熱,那么還是把數據會繼續異步存入熱點區域。
怎么保證最小侵入性?一般會集成專用的sdk,把侵入性代碼都封裝起來,然后底層框架會用Jedis,來兼容業務的其他Redis訪問。
為什么SDK封裝,都很少用lettuce、redisson?因為jedis更接近底層,而且更穩定,容易封裝。
結束語
能看到這里的你,一定是個熱愛編程的同學。如果想要有計劃地準備大廠面試,歡迎關注。