亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis中怎么解決Big?Key問題

發布時間:2023-03-15 11:41:28 來源:億速云 閱讀:136 作者:iii 欄目:開發技術

這篇文章主要介紹“Redis中怎么解決Big Key問題”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Redis中怎么解決Big Key問題”文章能幫助大家解決問題。

一、什么是Big Key?

通俗易懂的講,Big Key就是某個key對應的value很大,占用的redis空間很大,本質上是大value問題。key往往是程序可以自行設置的,value往往不受程序控制,因此可能導致value很大。

redis中這些Big Key對應的value值很大,在序列化/反序列化過程中花費的時間很大,因此當我們操作Big Key時,通常比較耗時,這就可能導致redis發生阻塞,從而降低redis性能。

用幾個實際的例子對大Key的特征進行描述:

● 一個String類型的Key,它的值為5MB(數據過大);

● 一個List類型的Key,它的列表數量為20000個(列表數量過多);

● 一個ZSet類型的Key,它的成員數量為10000個(成員數量過多);

● 一個Hash格式的Key,它的成員數量雖然只有1000個但這些成員的value總大小為100MB(成員體積過大);

在實際業務中,大Key的判定仍然需要根據Redis的實際使用場景、業務場景來進行綜合判斷。通常都會以數據大小與成員數量來判定。

二、Big Key產生的場景?

1、redis數據結構使用不恰當

將Redis用在并不適合其能力的場景,造成Key的value過大,如使用String類型的Key存放大體積二進制文件型數據。

2、未及時清理垃圾數據

沒有對無效數據進行定期清理,造成如HASH類型Key中的成員持續不斷的增加。即一直往value塞數據,卻沒有刪除機制,value只會越來越大。

3、對業務預估不準確

業務上線前規劃設計考慮不足沒有對Key中的成員進行合理的拆分,造成個別Key中的成員數量過多。

4、明星、網紅的粉絲列表、某條熱點新聞的評論列表

假設我們使用List數據結構保存某個明星/網紅的粉絲,或者保存熱點新聞的評論列表,因為粉絲數量巨大,熱點新聞因為點擊率、評論數會很多,這樣List集合中存放的元素就會很多,可能導致value過大,進而產生Big Key問題。

三、Big Key的危害?

1、阻塞請求

Big Key對應的value較大,我們對其進行讀寫的時候,需要耗費較長的時間,這樣就可能阻塞后續的請求處理。Redis的核心線程是單線程,單線程中請求任務的處理是串行的,前面的任務完不成,后面的任務就處理不了。

2、內存增大

讀取Big Key耗費的內存比正常Key會有所增大,如果不斷變大,可能會引發OOM(內存溢出),或達到redis的最大內存maxmemory設置值引發寫阻塞或重要Key被逐出。

3、阻塞網絡

讀取單value較大時會占用服務器網卡較多帶寬,自身變慢的同時可能會影響該服務器上的其他Redis實例或者應用。

4、影響主從同步、主從切換

刪除一個大Key造成主庫較長時間的阻塞并引發同步中斷或主從切換。

四、如何識別Big Key?

1、使用redis自帶的命令識別

例如可以使用Redis官方客戶端redis-cli加上--bigkeys參數,可以找到某個實例5種數據類型(String、hash、list、set、zset)的最大key。
    優點是可以在線掃描,不阻塞服務;缺點是信息較少,內容不夠精確。

2、使用debug object key命令

根據傳入的對象(Key的名稱)來對Key進行分析并返回大量數據,其中serializedlength的值為該Key的序列化長度,需要注意的是,Key的序列化長度并不等同于它在內存空間中的真實長度,此外,debug object屬于調試命令,運行代價較大,并且在其運行時,進入Redis的其余請求將會被阻塞直到其執行完畢。并且每次只能查找單個key的信息,官方不推薦使用。

3、redis-rdb-tools開源工具

這種方式是在redis實例上執行bgsave,bgsave會觸發redis的快照備份,生成rdb持久化文件,然后對dump出來的rdb文件進行分析,找到其中的大key。

優點在于獲取的key信息詳細、可選參數多、支持定制化需求,結果信息可選擇json或csv格式,后續處理方便,其缺點是需要離線操作,獲取結果時間較長。

五、如何解決Big Key問題?

要解決Big Key問題,無非就是減小key對應的value值的大小,也就是對于String數據結構的話,減少存儲的字符串的長度;對于List、Hash、Set、ZSet數據結構則是減少集合中元素的個數。

1、對大Key進行拆分

將一個Big Key拆分為多個key-value這樣的小Key,并確保每個key的成員數量或者大小在合理范圍內,然后再進行存儲,通過get不同的key或者使用mget批量獲取。

2、對大Key進行清理

對Redis中的大Key進行清理,從Redis中刪除此類數據。Redis自4.0起提供了UNLINK命令,該命令能夠以非阻塞的方式緩慢逐步的清理傳入的Key,通過UNLINK,你可以安全的刪除大Key甚至特大Key。

3、監控Redis的內存、網絡帶寬、超時等指標

通過監控系統并設置合理的Redis內存報警閾值來提醒我們此時可能有大Key正在產生,如:Redis內存使用率超過70%,Redis內存1小時內增長率超過20%等。

4、定期清理失效數據

如果某個Key有業務不斷以增量方式寫入大量的數據,并且忽略了其時效性,這樣會導致大量的失效數據堆積。可以通過定時任務的方式,對失效數據進行清理。

5、壓縮value

使用序列化、壓縮算法將key的大小控制在合理范圍內,但是需要注意序列化、反序列化都會帶來一定的消耗。如果壓縮后,value還是很大,那么可以進一步對key進行拆分。

補充知識:key設計

(1)【建議】: 可讀性和可管理性

以業務名(或數據庫名)為前綴(防止key沖突),用冒號分隔,比如業務名:表名:id
o2o:order:1

(2)【建議】:簡潔性

保證語義的前提下,控制key的長度,當key較多時,內存占用也不容忽視,例如:
user:{uid}:friends:messages:{mid} 簡化為 u:{uid}m:{mid}

(3)【強制】:不要包含特殊字符

反例:包含空格、換行、單雙引號以及其他轉義字符

關于“Redis中怎么解決Big Key問題”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新干县| 桃园县| 黄骅市| 泽州县| 鄂伦春自治旗| 固始县| 青神县| 永靖县| 沙雅县| 汕头市| 清河县| 梧州市| 陈巴尔虎旗| 棋牌| 三门县| 阜新| 民和| 芦溪县| 伊宁县| 青田县| 安顺市| 景泰县| 星子县| 大田县| 平果县| 绿春县| 若尔盖县| 永靖县| 海南省| 西华县| 白玉县| 天门市| 景德镇市| 凤阳县| 囊谦县| 景泰县| 深圳市| 大田县| 柞水县| 安庆市| 仁寿县|