前段時間,看到這個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問題怎麼産生
- redis中的key-value鍵值對設定不當,造成key對應的value值特别大。
- 對于list,set這種類型的結構,無效的資料沒有及時的删除。
- 對業務分析不準确,導緻實際業務中value值過大,如熱點問題。
🎈BigKey問題怎麼定位
- 使用redis自帶的指令 redis-cli --bigkeys 線上掃描大key,顯示的資訊不詳細,但是不影響redis的正常使用。
- 使用第三方工具redis-rdb-tools,使用過程中會先使用bgsave指令dump一個rdb鏡像,然後對這個鏡像進行分析,不影響redis對外提供服務。
🎈BigKey造成的影響
-
占用記憶體增大
相比于正常的Key,讀取大key需要的記憶體會有所增大,如果像是value中的list不斷變大,可能會造成OOM(記憶體溢出),還有一種就是達到redis設定的最大記憶體maxmemory值會造成寫阻塞或者部分重要的Key被redis的淘汰政策給删除了。
-
網絡阻塞延遲變大
在讀取大key的時候,由于讀取的内容較多,占用較大的帶寬,造成網絡帶寬的阻塞,也會影響其他的應用,導緻網絡阻塞延遲變大。
-
IO阻塞延遲增大
BigKey問題對應的value相對較大,當對較大的value進行讀寫,耗費的時間較長,這樣就可能阻塞後續的請求處理,其實主要是BigKey的value進行IO寫的時候會耗費較長的時時間,IO寫是把處理之後值通過網絡傳回給請求端,因為Redis的核心線程是單線程,也就是工作線程是單線程,單線程中的任務處理是串行執行的,前面的任務完成之後,後面的任務才能繼續執行,是以因為單個BigKey的原因可能造成IO阻塞延遲。
-
.BigKey遷移困難
這個問題是出現在Redis叢集中,當需要對大value進行遷移(對于Redis 叢集slot的遷移),主要是使用migrate指令進行遷移的,migrate指令是通過dump和restore和del三個指令組合成原子指令完成,如果是存在bigkey的話,可能會因為大value的原因導緻遷移失敗,而且較慢的migrate會阻塞Redis,影響Redis服務。
🎈BigKey問題如何解決
-
針對BigKey進行拆分
通過将BigKey拆分成多個小Key的鍵值對,并且拆分後的對應的value大小和拆分成的成員數量比較合理,然後進行存儲即可,在擷取的時候通過get不同的key或是用mget批量擷取存儲的鍵值對。
-
清理無效的資料
這個主要是針對像是list和set這種類型,在使用的過程中,list和set中對應的内容不斷增加,但是由于之前存儲的已經是無效的了,需要定時的對list和set進行清理。
-
壓縮對應的BigKey的value
可以通過序列化或者壓縮的方法對value進行壓縮,是其變為較小的value,但是如果壓縮之後如果對應的value還是特别大的話,就需要使用拆分的方法進行解決了。
-
監控Redis中記憶體,帶寬,增長率
通過監控系統,監控redis中的記憶體占用大小和網絡帶寬的占用大小,以及固定時間内的記憶體占用增長率,當超過設定的門檻值的時候,進行報警通知處理。
溫馨提醒:這個有點多,請仔細看下去