天天看點

2023-06-29:redis中什麼是熱點Key?該如何解決?

作者:福大大架構師每日一題

2023-06-29:redis中什麼是熱點Key?該如何解決?

答案2023-06-29:

在Redis中,經常被通路的key被稱為熱點key。

産生原因和危害

原因

熱點key問題産生的原因可以歸納為以下兩種情況:

使用者對于某些資料的通路頻率遠大于資料的生産頻率,這類資料包括熱門商品、熱點新聞、熱點評論以及明星直播等。

在日常工作生活中,突發事件(如雙十一期間商品降價促銷)可能導緻某些熱門商品被大量點選浏覽或購買,産生了巨大的需求量。類似地,熱點新聞、熱點評論和明星直播等引起大量刊發和浏覽的情況也是典型的讀多寫少場景,它們會産生熱點問題。

請求集中在分片叢集中,超過單個伺服器的性能極限。在服務端進行資料通路時,通常會對資料進行分片切分,其中某個伺服器上的熱點Key通路量超過了其承載能力的極限,進而導緻熱點Key問題的出現。

危害

1、流量集中,超過實體網卡的處理能力上限。

2、請求過多,導緻緩存分片服務崩潰。

3、資料庫擊穿,引發業務雪崩。

發現熱點key

預估發現

針對業務,可以提前預估出通路頻繁的熱點Key,例如在秒殺商品業務中,秒殺商品就是熱點Key的典型案例。

然而,并非所有業務都容易預估出熱點Key,有時可能會出現對熱點Key的遺漏或預估錯誤的情況。

用戶端發現

用戶端實際上是離"熱點Key"最近的位置,因為Redis指令是由用戶端發送的。以Jedis為例,在核心指令入口處使用Google Guava中的AtomicLongMap可以友善地記錄熱點Key的通路情況,示例如下:

然而,使用用戶端進行熱點Key的統計也存在一些問題:

(1) 無法預知熱點Key的數量,可能存在記憶體洩露的風險。

(2) 在不同的用戶端代碼中需要維護此邏輯,可能增加維護成本。

(3) 在規模化彙總方面的實作相對複雜。

Redis發現

monitor指令

使用Redis的monitor指令,可以監控到Redis執行的所有指令。通過解析monitor的結果,我們可以統計一段時間内的熱點Key排行榜、指令排行榜以及用戶端分布等資料。這種方法能夠提供更詳細的資訊,幫助我們深入了解Redis的使用情況。需要注意的是,在生産環境中使用monitor指令可能對性能産生一定的影響,是以應該謹慎使用,并注意網絡開銷和輸出緩沖區的消費速度。

2023-06-29:redis中什麼是熱點Key?該如何解決?

image.png

Redis-Faina是Facebook開源的一款使用Python語言實作的工具。它利用上述原理可以擷取最近10萬條指令的熱點Key、熱點指令以及指令執行的耗時分布等資料。為了減少網絡開銷并提高輸出緩沖區的消費速度,Redis-Faina會盡可能地在本機執行monitor指令。使用Redis-Faina可以更詳細地了解Redis的使用情況。需要注意,在生産環境中使用該工具時應考慮性能影響和安全性。

此種方法存在兩個問題:

1、在高并發條件下,使用monitor指令會導緻記憶體暴增,同時可能影響Redis的性能。是以,這種方法适合在短時間内使用,而不适合長時間或高并發的監控。

2、monitor指令隻能統計單個Redis節點的熱點key,對于Redis叢集,需要進行彙總統計才能擷取全叢集的熱點key資訊。

可以參考的架構:Facebook開源的redis-faina正是利用上述原理使用Python語言實作的

hotkeys

Redis在版本4.0.3中為redis-cli提供了--hotkeys選項,用于友善地找到熱點key。通過使用該選項,我們可以快速擷取到Redis中的熱點key資訊。這個功能的引入為我們在分析和優化Redis性能時提供了更友善和直接的工具。需要注意的是,確定Redis版本符合要求,并使用适當的指令行選項來獲得所需的熱點key資訊。

2023-06-29:redis中什麼是熱點Key?該如何解決?

image.png

如果發生錯誤,確定先将記憶體逐出政策設定為allkeys-lfu或者volatile-lfu,否則可能會傳回錯誤。

2023-06-29:redis中什麼是熱點Key?該如何解決?

image.png

2023-06-29:redis中什麼是熱點Key?該如何解決?

image.png

然而,如果鍵值非常多,執行此操作可能會變得相對較慢,這與熱點的概念有些相悖。此外,熱度的定義可能不夠準确。

抓取TCP包發現熱點key

Redis用戶端使用TCP協定與服務端進行互動,通信協定采用RESP。可以通過對機器上所有Redis端口的TCP資料包進行抓取來完成熱點key的統計。這種方法對Redis用戶端和服務端沒有侵入,是一種較完美的方案。然而,存在以下三個問題:

1.需要進行一定的開發工作。

2.對于高流量的機器抓包,可能會對機器網絡産生幹擾,并可能丢包。

3.維護成本較高。

為了解決這些問題,有一些開源方案如ELK(ElasticSearch, Logstash, Kibana)體系下的packetbeat插件可以實作Redis、MySQL等服務的資料包抓取、分析和報表展示。

處理熱點key

發現熱點key後,可以采取以下方法進行處理:

  1. 1. 使用二級緩存:使用Guava Cache或HCache将熱點key加載到JVM中作為本地緩存。通路這些key時,直接從本地緩存擷取資料,避免直接通路Redis層,有效保護緩存伺服器。
  2. 2. key分散:将熱點key分散為多個子key,并分别存儲在緩存叢集的不同機器上。這些子key的值與熱點key相同。當通過熱點key查詢資料時,通過某種雜湊演算法随機選擇一個子key,然後再通路緩存機器,将熱點key分散到多個子key上。

請注意,以上隻是幾種處理熱點key的方法,根據實際需求和系統情況,可能還會有其他适合的解決方案。

收錄于合集 #福大大架構師每日一題

861個

上一篇gmap建構離線地圖,用createCustomerTiledLayer方法,瓦片位址尾部多了 ?x={x}&y={y}&z&{

繼續閱讀