首頁歷史 > 正文

HFL Redis_10_set型別底層儲存資料結構

2022-02-07由 i技術 發表于 歷史

HotFrameLearning(簡稱 HFL) Redis_10_set型別底層儲存資料結構

-

一、大致介紹

```

1、上一篇講解了hash的底層資料結構,趁熱我們趕緊接下來看看 set 資料型別吧;

2、接下來我就透過參考

redis-6.0.6

原始碼給大家介紹下set的底層資料結構吧;

```

二、set資料結構

2。1 原始碼詳解(saddCommand)

HFL Redis_10_set型別底層儲存資料結構

圖1 - saddCommand方法

HFL Redis_10_set型別底層儲存資料結構

圖2 - setTypeCreate方法

HFL Redis_10_set型別底層儲存資料結構

圖3 - setTypeAdd方法

```

1、圖1中,我們可以看到一個 SADD 命令大體執行流程,先是看看 set 資料結構是否存在,不存在的話則構建出新物件進行新增入參,存在的話則透過迴圈將入參的資料放進 set 資料結構中,最後做出響應處理;

2、圖2中,我們看到首先檢查value是否是整型,若為整型的話則建立一個intset型別的物件;若不為整型的話則建立一個dict型別的物件;intset 結構體的 type = OBJ_SET,encoding = OBJ_ENCODING_INTSET,dict 結構體的 type = OBJ_SET,encoding = OBJ_ENCODING_HT;

3、圖3中,前半段主要針對 OBJ_ENCODING_HT 編碼型別的資料結構做處理,後半段主要針對 OBJ_ENCODING_INTSET 編碼型別的資料結構做處理,由此可見,set 型別的底層也有兩種資料結構:hashTable(dict) 與 intset 兩種;

```

2。2 涉及到的資料結構體

HFL Redis_10_set型別底層儲存資料結構

圖4 - intset結構體

HFL Redis_10_set型別底層儲存資料結構

圖5 - dict結構體

```

1、圖4中,intset 的資料結構大家一樣就能看明白是怎麼回事了,這裡就暫不講啦;

2、圖5中,我們主要關注,資料是存放在 dictht ht[2]; 中的,ht[0] 用於正常存放資料的,ht[1] 用於輔助擴容用的,擴容完後 ht[1] 又會置位 null;

```

歡迎關注+點贊,您的肯定是對我最大的支援!!!

頂部