redis的作者為了方便自己的使用,在redis中定義了動態字串sds,鍊錶,字典dict,跳躍表skiplist,整數集合intset和壓縮列表ziplist這六種資料結構。下文,我簡要地介紹一下幾種資料結構的定義。
sds的全稱叫****** dynamic string,它的定義和注釋如下
struct sdshdr ;
使用sds有這樣幾個好處
1. 空間惰性釋放:因為len和free記錄了buf的長度,所以當我們釋放掉乙個舊的字串的時候,可以用free來記錄下buf的長度,當下次要用新的字串的時候,可以直接使用。
2. 空間預分配:在初始化階段可以分配比需要的更多的空間,並把大小儲存在free裡,需要的時候就不用重新分配新的空間了。
3. 緩衝區安全:因為已經記錄了buf的長度,所以不會出現溢位的問題。
4. 快速:獲得字串長度的功能的時間複雜度縮減到了o(1)。
5. 二進位制安全且相容部分c風格字串的表達:由於c風格的字串以』\0』結尾來表示字串的末尾,所以它並不是二進位制安全的,sds的字串長度是按照len屬性的值來規定的,對所有字元都一視同仁。但是,sds為了相容c的輸出,缺省會在字串末尾加上』\0』。
redis的鍊錶就是乙個普通的雙向鍊錶,額外的是redis為一條鍊錶構造了乙個list結構體,裡面儲存了這個鍊錶的基本資訊
typedef
struct listnode listnode;
typedef
struct
list list;
如果集合裡全是整數,那麼就可以用intset來儲存集合裡的所有整數。
typedef struct intset intset;
contents裡的元素是從小到大按序排列的,如果原來陣列的編碼型別是int16_t,而新存入的數要大於或者小於int16_t的取值範圍的話,編碼的型別就會從int16_t提公升到更大的範圍,如果原來的contents陣列的大小不夠的話,就需要重新申請空間。 redis基本資料結構概述
redis 有 5 種基礎資料結構,分別為 string 字串 list 列表 hash 雜湊 set 集合 和 zset 有序集合 以下圖示並不代表記憶體連續,僅僅只是邏輯表述。因為redis的key值為字串,當我們使用字串型別作為value時,我們是在將乙個字串對映另乙個字串。member是不可...
redis基本資料結構之ZSet
zset資料結構類似於set結構,只是zset結構中,每個元素都會有乙個分值,然後所有元素按照分值的大小進行排列,相當於是乙個進行了排序的鍊錶。如果zset是乙個鍊錶,而且內部元素是有序的,在進行元素插入和刪除,以及查詢的時候,就必須要遍歷鍊錶才行,時間複雜度就達到了o n 這個在以單執行緒處理的r...
Redis基本資料結構之ZSet
zset保留了集合不能有重複成員的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下標作為排序依據不同的是,它給每個元素設定乙個分數 score 作為排序的依據。有序集合中的元素不能重複,但是score可以重複,就和乙個班裡的同學學號不能重複,但是考試成績可以相同。新增元素 命令為 ...