Redis資料結構之map 和 set 和 sortedset
map的結構是典型的字典結構
他的命令是H開頭的一些命令 hset 、hget 、hexists (用來判斷是否存在某個欄位 返回值是1 說明存在)
用途: 可以用來儲存類似物件的資料 一定要注意value不能 巢狀其他型別了
map的資料結構 在dict.h 這個檔案裡 有兩種: 1)hash 2)ziplist 資料量小的時候用這個
map原始碼解讀 在src目錄下的dict.h這個檔案裡 map的定義是這段程式碼 typedef struct dictEntry{ void *key; //這個是key union{ //這個用來儲存value void *val; uint64_t u64; int64_t s64; double d; } v; struct dictEntry *next; //用來儲存相鄰元素的指標 去維護hash桶的內部鏈 作用是在處理hash碰撞的時候通過連結串列的方式來實現 } dictEntry;
typedef stuct dictht{ //作用是通過bucket去存放dictEntry地址 可以認為他是一個bucket 通過hash演算法來計算key應該放在哪個bucket裡面 dictEntry **table; unsigned long size; unsigned long sizemask; unsigned long used; } dictht;
hash 擴容時會做rehash操作 typedef struct dict{ //它是rehash的核心 dictType *type; void *private; dictht ht [2]; long rehashidx; //當前key rehash到bucket的標誌 int iterators; } dict
應用場景是 用來存放物件資訊 因為他是一個二維表結構
set型別資料
資料結構 有兩種: intset 當資料中僅包含整數型別的時候 用intset來儲存這個集合 hashtable 當資料中的型別不一致時 它使用key來儲存值 value設為空即null set中的資料是不重複的 set的原始碼太簡單了 我都不屑於再碼一般 此處略過 應用場景 1、做標籤 應用它的集合性質 2、去重 應用它的key是不能重複的這個性質 3、共同好友 可以用來計算常規的集合操作 交集 並集等
sortedset 有序集合 sortedset和set都是集合 區別是sortedset 多了一個score的概念,這是sortedset有序的實現
sortedset的資料結構 資料結構的話有兩種 ziplist skiplist+hashtble 我試著把skiplist講清楚 首先這是一個有序的連結串列 當我們向集合裡新增資料的時候先去做一個演算法 ,簡單理解就是這是一個隨機演算法;作用是:獲取插入資料的層數
第一步:比如新增的資料a比如是14,比如經過演算法計算得到的level-a=1;那就意味著這個20 存放的位置是第1層 第二步:再新增一個數據b比如是19 這裡會做一個比較 19和14進行比較 a<b 所以會把b插入到a的後面 反之亦然,同時 用演算法獲取與b想對應的level-b進行儲存; 第三步:再插入一個數據c 比如是8 首先會從level最高的那個資料獲取值進行比較依次向下,找到正確的位置 並獲取level進行儲存; level的沒一層是有連線的 , 組成了連結串列 。 這是一個變種的二分法, 隨著層數的增加, 資料會越來越少
這個連結串列的開始端是header 末尾端是null 查詢資料時通過level來查詢資料