天天看點

一篇弄懂Redis中的BigKey問題

​前段時間,看到這個BigKey的問題,因為了解的模糊不清的不太舒服,于是就有了下文的總結。​

📙

  • ​​🍖redis中的BigKey問題及解決方案❓​​
  • ​​🎈BigKey問題是什麼​​
  • ​​🎈BigKey問題怎麼産生​​
  • ​​🎈BigKey問題怎麼定位​​
  • ​​🎈BigKey造成的影響​​
  • ​​🎈BigKey問題如何解決​​
  • ​​🍚拓展​​
  • ​​💯總結​​

🤞這次都給他拿下🤞

正菜來了🛴🛴🛴

🍖redis中的BigKey問題及解決方案❓

🎈BigKey問題是什麼

BigKey的具體表現是redis中的key對應的value很大,占用的redis空間比較大,本質上是大value問題。

常幾個常見的例子:

● 對于String類型的value值,值超過5MB(資料值過大);

● 對于List類型的value值,含有的成員數量為20000個(成員數量多);

● 對于ZSet類型的value值,含有的成員數量為10000個(成員數量多);

● 對于Hash格式的value值,含有的成員數量1000個,但所有成員變量的總value值大小為100MB(成員總的體積過大);

🎈BigKey問題怎麼産生

  1. redis中的key-value鍵值對設定不當,造成key對應的value值特别大。
  2. 對于list,set這種類型的結構,無效的資料沒有及時的删除。
  3. 對業務分析不準确,導緻實際業務中value值過大,如熱點問題。

🎈BigKey問題怎麼定位

  1. 使用redis自帶的指令 redis-cli --bigkeys 線上掃描大key,顯示的資訊不詳細,但是不影響redis的正常使用。
  2. 使用第三方工具redis-rdb-tools,使用過程中會先使用bgsave指令dump一個rdb鏡像,然後對這個鏡像進行分析,不影響redis對外提供服務。

🎈BigKey造成的影響

  1. 占用記憶體增大

    相比于正常的Key,讀取大key需要的記憶體會有所增大,如果像是value中的list不斷變大,可能會造成OOM(記憶體溢出),還有一種就是達到redis設定的最大記憶體maxmemory值會造成寫阻塞或者部分重要的Key被redis的淘汰政策給删除了。

  2. 網絡阻塞延遲變大

    在讀取大key的時候,由于讀取的内容較多,占用較大的帶寬,造成網絡帶寬的阻塞,也會影響其他的應用,導緻網絡阻塞延遲變大。

  3. IO阻塞延遲增大

    BigKey問題對應的value相對較大,當對較大的value進行讀寫,耗費的時間較長,這樣就可能阻塞後續的請求處理,其實主要是BigKey的value進行IO寫的時候會耗費較長的時時間,IO寫是把處理之後值通過網絡傳回給請求端,因為Redis的核心線程是單線程,也就是工作線程是單線程,單線程中的任務處理是串行執行的,前面的任務完成之後,後面的任務才能繼續執行,是以因為單個BigKey的原因可能造成IO阻塞延遲。

  4. .BigKey遷移困難

    這個問題是出現在Redis叢集中,當需要對大value進行遷移(對于Redis 叢集slot的遷移),主要是使用migrate指令進行遷移的,migrate指令是通過dump和restore和del三個指令組合成原子指令完成,如果是存在bigkey的話,可能會因為大value的原因導緻遷移失敗,而且較慢的migrate會阻塞Redis,影響Redis服務。

🎈BigKey問題如何解決

  1. 針對BigKey進行拆分

    通過将BigKey拆分成多個小Key的鍵值對,并且拆分後的對應的value大小和拆分成的成員數量比較合理,然後進行存儲即可,在擷取的時候通過get不同的key或是用mget批量擷取存儲的鍵值對。

  2. 清理無效的資料

    這個主要是針對像是list和set這種類型,在使用的過程中,list和set中對應的内容不斷增加,但是由于之前存儲的已經是無效的了,需要定時的對list和set進行清理。

  3. 壓縮對應的BigKey的value

    可以通過序列化或者壓縮的方法對value進行壓縮,是其變為較小的value,但是如果壓縮之後如果對應的value還是特别大的話,就需要使用拆分的方法進行解決了。

  4. 監控Redis中記憶體,帶寬,增長率

    通過監控系統,監控redis中的記憶體占用大小和網絡帶寬的占用大小,以及固定時間内的記憶體占用增長率,當超過設定的門檻值的時候,進行報警通知處理。

    ​溫馨提醒:這個有點多,請仔細看下去​

🍚拓展

💯總結

繼續閱讀