12.4龙致、處理bigkey

處理bigkey

bigkey是指key對應(yīng)的value所占的內(nèi)存空間比較大掰茶,例如一個(gè)字符串類型的value可以最大存到512MB,一個(gè)列表類型的value最多可以存儲2^32-1個(gè)元素。如果按照數(shù)據(jù)結(jié)構(gòu)來細(xì)分的話靴迫,一般分為字符串類型bigkey和非字符串類型bigkey惕味。

  • 字符串類型:體現(xiàn)在單個(gè)value值很大,一般認(rèn)為超過10KB就是bigkey玉锌,但這個(gè)值和具體的OPS相關(guān)名挥。

  • 非字符串類型:哈希、列表主守、集合禀倔、有序集合,體現(xiàn)在元素個(gè)數(shù)過多参淫。

bigkey無論是空間復(fù)雜度和時(shí)間復(fù)雜度都不太友好救湖,下面我們將介紹它的危害。

注意:因?yàn)榉亲址當(dāng)?shù)據(jù)結(jié)構(gòu)中涎才,每個(gè)元素實(shí)際上也是一個(gè)字符串鞋既,但這里只討論元素個(gè)數(shù)過多的情況。

  1. bigkey的危害

    bigkey的危害體現(xiàn)在三個(gè)方面:

    • 內(nèi)存空間不均勻 (平衡):例如在Redis Cluster中耍铜,bigkey會造成節(jié)點(diǎn)的內(nèi)存空間使用不均勻邑闺。

    • 超時(shí)阻塞:由于Redis單線程的特性,操作bigkey比較耗時(shí)棕兼,也就是意味著阻塞Redis可能性增大陡舅。

    • 網(wǎng)絡(luò)阻塞:每次獲取bigkey產(chǎn)生的網(wǎng)絡(luò)流量較大,假設(shè)一個(gè)bigkey為1MB程储,每秒訪問量為1000蹭沛,那么每秒產(chǎn)生1000MB的流量,對于普通的千兆網(wǎng)卡(按照字節(jié)算是128MB/s)的服務(wù)器來說簡直是滅頂之災(zāi)章鲤,而且一般服務(wù)器會采用單機(jī)多實(shí)例的方式來部署摊灭,也就是說一個(gè)bigkey可能會其他實(shí)例造成影響,其后果不堪設(shè)想败徊。

    bigkey的存在并不是完全致命的帚呼,如果這個(gè)bigkey存在但是幾乎不被訪問,那么只有內(nèi)存空間不均勻的問題存在皱蹦,相對于另外兩個(gè)問題沒有那么重要緊急煤杀,但是如果bigkey是一個(gè)熱點(diǎn)key(頻繁訪問),那么其帶來的危害不可想象沪哺,所以在實(shí)際開發(fā)和運(yùn)維是一定要密切關(guān)注bigkey的存在沈自。

  2. 如何發(fā)現(xiàn)

    redis-cli --bigkeys可以命令統(tǒng)計(jì)bigkey的分布,但是在生產(chǎn)環(huán)境中辜妓,開發(fā)和運(yùn)維人員更希望自己可以定義bigkey的大小枯途,而且更希望找到真正的bigkey都有哪些忌怎,這樣才可以去定位、解決酪夷、優(yōu)化問題榴啸。判斷一個(gè)key是否為bigkey,只需要執(zhí)行debug object key查看serializedlength屬性即可晚岭,它表示key對應(yīng)的value序列化之后的字節(jié)數(shù)鸥印。

    在實(shí)際生產(chǎn)環(huán)境中發(fā)現(xiàn)bigkey的兩種方式如下:

    • 被動收集:許多開發(fā)人員確實(shí)可能對bigkey不了解或重視程序不夠,但是這種bigkey一旦大量訪問坦报,很可能就會帶來命令慢查詢和網(wǎng)卡跑滿問題库说,開發(fā)人員通過對異常的分析能找到異常原因可能是bigkey,這種方式雖然不是被筆者推薦的燎竖,但是實(shí)際生產(chǎn)環(huán)境中卻大量存在璃弄,建議修改Redis客戶端,當(dāng)拋出異常時(shí)打印出所操作的key构回,方便排查bigkey問題夏块。

    • 主動監(jiān)測:scan + debug object:如果懷疑存在bigkey,可以使用scan命令漸進(jìn)的掃描出所有的key纤掸,分別計(jì)算每個(gè)key的serializedlength脐供,找到對應(yīng)bigkey進(jìn)行相應(yīng)的處理和報(bào)警,這種方式是比較推薦的方式借跪。

    開發(fā)提示:

    • 如果兼職個(gè)數(shù)比較多政己,scan + debug object會比較慢,可以利用Pipeline機(jī)制完成掏愁。

    • 對于元素個(gè)數(shù)較多的數(shù)據(jù)結(jié)構(gòu)歇由,debug object執(zhí)行速度比較慢,存在阻塞Redis的可能果港。

    • 如果有從節(jié)點(diǎn)沦泌,可以考慮在從節(jié)點(diǎn)上執(zhí)行。

  3. 如何刪除

    當(dāng)發(fā)現(xiàn)Redis中有bigkey并且確認(rèn)要?jiǎng)h除時(shí)辛掠,如何優(yōu)雅地刪除bigkey谢谦?無論是什么數(shù)據(jù)結(jié)構(gòu),del命令都將其刪除萝衩。但是相信通過上面的分析后你一定不會這么做回挽,因?yàn)閯h除bigkey通常來說會阻塞Redis服務(wù)。下面給出一組測試數(shù)據(jù)分別對string猩谊、hash千劈、list、set牌捷、sorted set五種數(shù)據(jù)結(jié)構(gòu)的bigkey進(jìn)行刪除墙牌,bigkey的元素個(gè)數(shù)和每個(gè)元素的大小不盡相同袁梗。

    注意:下面測試和服務(wù)器硬件、Redis版本比較相關(guān)憔古,可能在不同的服務(wù)器上執(zhí)行速度不大相同,但是嫩提供一定的參考價(jià)值淋袖。

    下表展示了刪除512KB~10MB的字符串類型數(shù)據(jù)所花費(fèi)的時(shí)間鸿市,總體來說由于字符串類型結(jié)構(gòu)相對簡單,刪除速度比較快即碗,但是隨著value值的不斷增大焰情,刪除速度也逐漸變慢。

    key類型 512KB 1MB 2MB 5MB 10MB
    string 0.22ms 0.31ms 0.32ms 0.56ms 1ms

    下表展示了非字符串類型的數(shù)據(jù)結(jié)構(gòu)在不同數(shù)量級剥懒、不同元素大小下對bigkey執(zhí)行del命令的時(shí)間内舟,總體上看元素個(gè)數(shù)越多、元素越大初橘,刪除時(shí)間越長验游,相對于字符串類型,這種刪除速度已經(jīng)足夠可以阻塞Redis保檐。

    key類型 10萬(8個(gè)字節(jié)) 100萬(8個(gè)字節(jié)) 10萬(16個(gè)字節(jié)) 100萬(16個(gè)字節(jié)) 10萬(128字節(jié)) 100(128字節(jié))
    hash 51ms 950ms 58ms 970ms 96ms 2000ms
    list 23ms 134ms 23ms 138ms 23ms 266ms
    set 44ms 873ms 58ms 881ms 73ms 1319ms
    sorted set 51ms 845ms 57ms 859ms 59ms 969ms

    從上分析可見耕蝉,除了string類型,其他四種數(shù)據(jù)刪除的速度有可能很慢夜只,這樣增大了阻塞Redis的可能性垒在。既然不能用del命令,那有沒有比較優(yōu)雅的方式進(jìn)行刪除呢扔亥,這時(shí)候就需要將第2章介紹的scan命令的若干類似命令拿出來:sscan场躯、hscan、zscan旅挤。

    1. string

      對于string類型使用del命令一般不會產(chǎn)生阻塞:

      del bigkey

    2. hash踢关、list、set谦铃、sorted set

      使用hscan命令耘成,每次獲取部分(例如100g個(gè))field-value,再利用hdel刪除每個(gè)field(為了快速可以使用Pipeline)驹闰。

  4. 最佳實(shí)踐思路

    由于開發(fā)人員對Redis的理解程度不同瘪菌,在實(shí)際開發(fā)中出現(xiàn)bigkey在所難免,重要的是嘹朗,能通過合理的檢測機(jī)制及時(shí)找到它們师妙,進(jìn)行處理。作為開發(fā)人員在業(yè)務(wù)開發(fā)時(shí)應(yīng)注意不能將Redis簡單暴力的使用屹培,應(yīng)該在數(shù)據(jù)結(jié)構(gòu)的選擇和設(shè)計(jì)上更加合理默穴,例如出現(xiàn)了bigkey怔檩,要思考一下可不可以做一些優(yōu)化(例如拆分?jǐn)?shù)據(jù)結(jié)構(gòu))盡量讓這些bigkey消失在業(yè)務(wù)中,如果bigkey不可避免蓄诽,也要思考一下要不要每次把所有元素都取出來(例如有時(shí)候僅僅需要hmget薛训,而不是hgetall)。最后仑氛,可喜的是乙埃,Redis將在4.0版本支持lazy delete free的模式,那是刪除bigkey不會阻塞Redis锯岖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末介袜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子出吹,更是在濱河造成了極大的恐慌遇伞,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捶牢,死亡現(xiàn)場離奇詭異鸠珠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叫确,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門跳芳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竹勉,你說我怎么就攤上這事飞盆。” “怎么了次乓?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵吓歇,是天一觀的道長。 經(jīng)常有香客問我票腰,道長城看,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任杏慰,我火速辦了婚禮测柠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缘滥。我一直安慰自己轰胁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布朝扼。 她就那樣靜靜地躺著赃阀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪擎颖。 梳的紋絲不亂的頭發(fā)上榛斯,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天观游,我揣著相機(jī)與錄音,去河邊找鬼驮俗。 笑死懂缕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的王凑。 我是一名探鬼主播提佣,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼荤崇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起潮针,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤术荤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后每篷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓣戚,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年焦读,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了子库。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡矗晃,死狀恐怖仑嗅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情张症,我是刑警寧澤仓技,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站俗他,受9級特大地震影響脖捻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜兆衅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一地沮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧羡亩,春花似錦摩疑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至及志,卻和暖如春片排,著一層夾襖步出監(jiān)牢的瞬間寨腔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工率寡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迫卢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓冶共,卻偏偏與公主長得像乾蛤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子捅僵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1 Redis介紹1.1 什么是NoSql為了解決高并發(fā)庙楚、高可擴(kuò)展上荡、高可用、大數(shù)據(jù)存儲問題而產(chǎn)生的數(shù)據(jù)庫解決方...
    克魯?shù)吕?/span>閱讀 5,303評論 0 36
  • 一馒闷、Python簡介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡介】: Python 是一個(gè)...
    _小老虎_閱讀 5,748評論 0 10
  • Redis是啥 Redis是一個(gè)開源的key-value存儲系統(tǒng)酪捡,由于擁有豐富的數(shù)據(jù)結(jié)構(gòu),又被其作者戲稱為數(shù)據(jù)結(jié)構(gòu)...
    一凡呀閱讀 1,176評論 0 5
  • NOSQL類型簡介鍵值對:會使用到一個(gè)哈希表纳账,表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù)逛薇,如redis,volde...
    MicoCube閱讀 3,998評論 2 27
  • 原帖地址:http://www.reibang.com/p/2f14bc570563 redis概述 Redis...
    onlyHalfSoul閱讀 2,176評論 0 28