跳躍表(skiplist)
跳躍表是一種有序資料結構。跳躍表支援平均o(logn),最壞o(n)複雜度的節點查詢,大部分情況下,跳躍表的效率可以和平衡樹相媲美,並且因為跳躍表的實現比平衡樹簡單,所有不少程式都用跳躍表代替平衡樹。redis使用跳躍表作為有序集合的底層實現,另乙個是在集群節點中用作內部資料結構。
1.1 跳躍表的實現
整數集合(intset)
整數集合(intset)是集合鍵的底層實現之一,當乙個集合只包含整數值元素,並且這個集合元素數量不多時,redis就會使用整數集合作為集合鍵的底層實現。
整數集合公升級,不支援降級。
每當將乙個元素新增到整數集合裡面,並且新元素的型別比整數集合現有所有元素的型別都要長時,整數集合需要先進行公升級,然後才能新增到整數集合裡面。公升級分三步進行:
1)根據新元素的型別,擴充套件整數集合底層陣列的空間大小,並為新元素分配空間。
2)將底層陣列現有的所有元素都轉換成與新元素相同的元素型別,並將型別轉換後的元素放置到正確的位置。
3)將新元素新增到底層陣列裡面。
公升級的好處
1)提公升靈活性。因為語言時靜態型別語言,不能將兩種不同型別的值放在同乙個資料結構裡面。因為整數集合可以自動公升級底層陣列來適應新元素。
2)節約記憶體。 要讓乙個陣列同時可以儲存int16_t,int32_t, int64_t三種型別通常做法直接使用int64_t型別作為陣列,這樣出現浪費記憶體。
公升級例子:將乙個型別int32_t的數值65535新增到int16_t型別集合裡面:
壓縮列表(ziplist)
壓縮列表時列表鍵和雜湊鍵的底層實現只一,當乙個列表只包含少量列表項,並且每個列表項要麼就是小整數值,要麼就是長度比較短的字串,那麼redis就會使用壓縮列表。
3.1 壓縮列表的構成
壓縮列表時redis為了節約記憶體而開發,是由一系列特殊編碼的連續記憶體塊組成的順序型的資料結構。乙個壓縮列表可以包含任意多個節點(entry),每個節點可以儲存乙個位元組陣列或者乙個整數值。
3.1 壓縮列表節點的構成
每個壓縮列表節點可以儲存乙個位元組陣列或者乙個整數值。其中,位元組陣列可以是以下三種長度中的一種:
長度小於等於63(2^6-1)位元組的位元組陣列;
長度小於等於16383(2^14-1)位元組的位元組陣列
長度小於等於4294967295(2^32-1)位元組的位元組陣列
整數值可以是以下6種長度中的一種:
4位長,介於0至12之間的無符號整數
1位元組長的有符號整數
3位元組長的有符號整數
int16_t型別整數
int32_t型別整數
int64_t型別整數
節點的 previous_entry_length屬性以位元組為單位,記錄了壓縮列表中前乙個節點的長度。
如果前一節點的長度小於254位元組,那麼 previous_entry_length屬性的長度為1位元組,
如果前一節點的長度大於等於254位元組,那麼 previous_entry_length屬性的長度為5位元組:其中屬性的第一位元組會被設定為0xfe(十進位制值254),而之後的四個位元組則用於儲存前一節點的長度。
節點的encoding屬性記錄了節點的content屬性所儲存資料的型別以及長度。
一位元組、兩位元組或者五位元組長,值的最高位為00、01或者10的是位元組陣列編碼:這種編碼表示節點的 content屬性儲存著位元組陣列,陣列的長度由編碼除去最高兩位之後的其他位記錄。
一位元組長,值的最高位以11開頭的是整數編碼:這種編碼表示節點的content屬性儲存著整數值,整數值的型別和長度由編碼除去最高兩位之後的其他位記錄。
節點的content屬性負責儲存節點的值,節點值可以是乙個位元組陣列或者整數,值的型別和長度由節點的encoding屬性決定。
節點的content屬性負責儲存節點的值,節點值可以是乙個位元組陣列或者整數,值的型別和長度由節點的encoding屬性決定
Redis資料結構與物件(二)
1 物件共享 如果redis中已經set了乙個字串或數字,再set同樣值,這時會實現物件引用共享。值物件的refcount會出現變化,增加。redis set a 100 ok redis set b 100 redis object refcount a integer 2 object refc...
Redis資料結構(二)
1 壓縮列表是為了節省記憶體而設計的,是一種線性的資料結構。主要用在雜湊和列表兩種資料型別中。2 壓縮列表包含主要包含五個部分,這五個部分順序排列組合在一起。結構如下圖所示。表節點,有三個域組成。previous entry length,用來記錄前乙個節點的長度。encoding,記錄下乙個域的資...
redis 資料結構與物件
簡單說下redis的資料結構,這些在網上也都有很詳細的解釋,redis 設計與實現 這本書基於redis3.0的,但是現在已經5.0 了,所以有些資料結構發生了變化,其中我自己實現發現了一部分,可能還有沒發現的。慢慢實踐吧 簡單動態字串是在c語音傳統的字串基礎上構建的,其資料結構為 struct s...