01-內存管理和優化-數據結構

通過了解數據結構,就能知道對象性能,邊界條件,就自然而然知道如何恰當的使用它們,做業務時就能選到最合適的對象。





上圖是Redis最基本的結構體,所有Redis對象都被封裝在RedisObject中。最基本的結構代碼往往是最精簡的。該結構中有5個成員,type 4 比特,encoding也是4比特。從代碼得知:

Redis的數據類型不超過16種,編碼方式不超過16種,且類型跟編碼方式不一一對應,一種類型可能有多個編碼方式,數據也可以共享。




首先看Object的第一個成員type,實際上Redis里面一共有5種類型:字符串、列表、集合、有序集合、哈希,這幾種方式和type的對應關系見下表。




當字符串較小,Redis里字符串長度<=39時,會用EMBSTR編碼方式。在這種編碼方式下,字符串跟Object在連續的內存上,省去了多次內存分配。不過當字符串增長或者改變時,不能用該種方式,需要換成第一種,所以長度限制為39。


String類型還有一種特殊的編碼方式,即字符串數值是整數的時候,為特殊的INT類型編碼。INT類型不需要ptr指到字符空間,而是直接用指針的值代表字符串的值,因此ptr已經不是指針。這樣就省去了sds開銷,其內存占用最小。實際上在Redis里,程序啟動時直接創建了10000個RedisObject,代表1-10000的整型,如果LRU沒有意義,后面就沒有其他開銷,用預先分配好的值。簡單來說,整數類型的Value比普通的Value節省內存,其值為0-10000,LRU無效情況下的String Object可共享,而且一般情況下沒必要強求EMBSTR。





上圖是壓縮列表,它相當于把所有的成員都疊在一起,沒有額外的數據結構,空間占用比較小。缺點是讀寫的時候整個壓縮列表都需要修改,所以一般在數據量小的時候才使用,一般能達到10倍的壓縮比。數據量大小都可以通過配置文件更改,Hash和List的默認情況是512和64,需要利用時就對業務進行改造,可以按日期拆分,每天一個Key,也可以按數值取模,或按前綴拆分等。通過合理的拆分,充分利用壓縮列表特性,壓縮率可達10倍,平均為5倍。




那其他容器在普通情況下用什么樣的數據結構呢?算法類的數據結構里用的最多的為哈希表。因為它的讀寫復雜度都是O(1),是所有數據結構里面最快的一種。Redis中的哈希表使用鏈地址法解決hash沖突問題,若有多個key的hash值一致,通過遍歷鏈表的形式找到目標Key。當哈希表的負載因子過大時,沖突幾率變大,其性能就會下降。Redis里面哈希表槽的數目是動態增長的,HT默認初始大小為4。當負載因子超出合理范圍(0.1 – 5)時進行擴縮容(rehash),將原來哈希表里面的數值rehash,放在新的哈希表里面,也就是說同時存在兩個哈希表,一舊一新。不過一次性rehash太多的Key可能導致服務長時間不可用,Redis采用漸進式rehash,分批進行。


Redis里用字典結構對Redis進行封裝,主要就是兩個哈希表,讀寫復雜度均為O(1)。DICT的讀寫效率最高。那什么時間進行漸進式Rehash的算法呢?每次對DICT執行添加、刪除、查找或者更新操作時,除了執行指定的操作以外,還會順帶將ht[0] 哈希表在rehashidx索引上的所有鍵值對rehash到ht[1],并將rehashidx的值增1;直到整個ht[0]全部完成rehash后,rehashindex設為-1,釋放ht[0],ht[1]置為ht[0],在ht[1]中創建一個新的空白表。



跳躍表是哈希里面用來做排序的,實現簡單,算法巧妙,算法效率和平衡樹一樣。算法核心為,每插入一個節點,節點是隨機數,第n+1層的節點數目為第n層的1/4,性能如上表所示。



原地址:https://mp.weixin.qq.com/s/n4HXKXPKf87qgZ_e6s4gPg

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容

  • 前言 Redis是目前最火爆的內存數據庫之一,通過在內存中讀寫數據,大大提高了讀寫速度,可以說Redis是實現網站...
    Java架構閱讀 1,293評論 1 16
  • 一、歷史概觀 箏是一種什么樣的樂器呢? 古箏是我國最古老的彈撥樂器之一,發源于我國戰國時期,至今已有兩千五百多年的...
    瀟湘妃子JC閱讀 1,312評論 0 3
  • 洪秀全的最后一次高考 1841年的高考就因為幾個小鬼子和幾個小阿三給攪黃了, 但是1843年的高考繼續進行。 洪秀...
    韜奮大叔閱讀 1,017評論 1 1
  • 基本觀點 1.本輪中國經濟復蘇的“拐點”是2016年3季度,領先指標是PPI由下跌止穩,步入快速上漲通道; 2.2...
    倪陽Momo閱讀 385評論 0 0
  • 1 我叫張大海,是個城管。說起這個過程,也是一把辛酸淚。好好的人家,但凡有個好去處,誰愿意出來做城管。干活臟、工資...
    古之月閱讀 606評論 0 0