redis相關的6種資料結構

2021-09-24 21:37:21 字數 1831 閱讀 3858

專案sds

c字串獲取字串長度

o(1)

o(n)

字串拼接時緩衝區溢位處理

通過free與當前待拼接的串作比較檢視是否記憶體是否足夠。如果不夠會做自動記憶體再分配。2*n(n為擴充之後的字串長度)

惰性釋放記憶體

對字串執行trim操作之後不會立即將多出來的記憶體釋放。而是記錄在free裡面待使用

2. 雙端鍊錶

資料結構:

/* * 雙端鍊錶結構

*/typedef struct list list;

特點:

查詢給定節點的前乙個節點,後乙個節點複雜度為o(1),往表頭或者表尾插入節點複雜度為o(1).

刪除給定節點,遍歷給定節點的複雜度為o(n)

應用範圍:

列表鍵,發布與訂閱,慢查詢,監視器

3. 字典

應用範圍:

計算hash鍵:當被用來作為資料庫底層實現或者雜湊鍵的底層實現時,用murmurhash2演算法

當字典超過負載因子時,採用rehash演算法:

應用場景:當hash表儲存的雜湊鍵值對太多或者太少時,需要對當前的雜湊表重新進行擴充套件或者收縮

擴充後的大小為: 第乙個大於或者等於 use * 2(2^n) 的值

收縮後的大小為: 第乙個大於或者等於 use 的值

漸進式rehash(分成多次將鍵值對由ht[0]移到ht[1],結束的標誌為rehashidx=-1 --rehash時使用)

step:

1.為ht[1]分配空間(分配方式見rehash擴充套件or收縮演算法),讓字典同時持有ht[0]和ht[1]

2.在rehash期間,每次從ht[0]移動資料到ht[1],rehashidx++,

3.每次對字典進行查詢操作,現在ht[0]中查詢是否存在該鍵值對。如果找不到檢視是否進行rehash操作,如果正在進行rehash操作會繼續在ht[1]中查詢

4.新增鍵值時,只會在ht[1]中新增。確保ht[0]處於收斂狀態

5.當ht[0]的use=0時,表示rehash操作已經完成。將ht[1]賦值給ht[0]。釋放ht[1]記憶體

跳躍表

應用範圍:

有序集合的底層實現,集群節點中使用

資料結構

/* * 跳躍表節點

*/typedef struct zskiplistnode level;

} zskiplistnode;

/* * 跳躍表

5. 整數集合

應用:用來存放元素均為整數的資料結構

集合鍵的底層實現

資料結構:

typedef struct intset intset;

壓縮列表

應用場景

列表鍵和雜湊鍵的底層實現之一。當列表或者雜湊表中包含的鍵值對是整數或者長度比較小的字串時,會採用壓縮列表作為底層實現之一

目的是為了節約記憶體

Redis五種資料結構

redis除了儲存鍵之外還可以儲存常見的5種資料型別,分別是 string list set zset hash。結構型別 結構儲存的值 結構的讀寫能力 string字串 可以是字串 整數或浮點數 對整個字串或字串的一部分進行操作 對整數或浮點數進行自增或自減操作 list列表 乙個鍊錶,鍊錶上的每...

Redis五種資料結構

對redis來說,所有的key 鍵 都是字串,所謂的5種資料結構是指針對value而言 資料結構型別 說明使用場景 常用方法 其他鏈結 string字串型別1 redis中最基本的資料型別,乙個key對應乙個value。2 是二進位制安全的,意思是 redis 的 string 可以包含任何資料。如...

Redis的5種資料結構

參考 基本型別有5個,string,mapmap,list,set,zset 從上到下一一對應,這是我取得別名 string 就是儲存二進位製流,這時候,jpg等,只要轉碼成功,均可儲存。mapmap 之所以叫mapmap,是因為,redis本身就是個map,而且儲存的不僅僅是乙個map,而是。ma...