redis底層資料結構

2021-10-09 21:48:11 字數 2000 閱讀 4659

1.1 string字串

表現形式為

資料結構:sds(簡單的動態字串)

使用原因:redis是使用c語言開發的,但在c語言中是沒有字串型別的,只能使用指標或符陣列的形式表示乙個字串,所以在redis設計了一種簡單的動態字串(可以根據不同的資料型別不同的資料結構選擇不同的資料結構)

支援的資料型別:字串,整數(原子遞增,返回乙個遞增以後的值),浮點

sds模型圖:

優點:1,sds獲取字串長度複雜度o(1),而c的字串為o(n)。

因為sds儲存了長度在len中,但是c的字串需要從頭到位遍歷字元陣列。

2,sds避免了一些c的記憶體溢位的問題。

在c中,某些情況下會發生記憶體溢位的問題。假如兩個字元出s1 『hello』,s2 『world』 在記憶體中緊挨著儲存著。如果在沒有給s1申請更多記憶體的前提下,就為s1追加一些字串,這時就不知情的把s2的資料修改了。而sds字串拼接函式,已經做好了檢查長度的問題,如果空間不夠,就會先擴充套件空間。

3,sds通過free的記憶體預分配和惰性釋放,降低記憶體分配次數

c的字串,每當增加長度的時候,都必須申請記憶體,不然可能記憶體溢位;每當減少長度的時候,都要釋放記憶體,不然可能內潤洩漏。而sds在len+free不夠的時候才擴充套件記憶體擴充套件的規則是 如果len小於 1mb,則len和free保持一致,這樣buffer陣列長度為2*len+1;如果len大於等於1mb時,free總是分配1mb,這樣buffer陣列長度為 len+1mb+1byte;當sds字串長度減少的時候,記憶體並不會立即**,而是把記憶體放到free中。這樣以後再需要增加長度的時候,不需要再申請記憶體。

4,判斷字串結尾的方式

c的字串以遇到』\0』作為判斷到了字串結尾,而sds以len來判斷。這樣sds中間可以包含』\0』

使用場景:session共享,ip限制(簡訊驗證)

注意:namespace key命名衝突(命名要規範)

1.2 list 列表

表現形式為:

資料結構:3.2版本之前採用的是:ziplist 和 linklist

3.2版本之後採用的是:quicklist

quicklist詳解:是由ziplist組成的雙向鍊錶

使用場景:訊息佇列(從左側存資料,從右側取資料)

棧:先進後出

1.3 hash

表現形式:

資料結構:hashtable(資料量大) ziplist(資料量小)

rehash:redis插入新節點前判斷是否要擴容

1.4 set(無序集合)

資料結構:inset(儲存整數型別的資料) hashtable

使用場景:標籤

1.4 zset(有序集合)

資料結構:skiplist(跳表)

skiplist(跳表的解釋):跳表就是鍊錶與二分法的結合。1.鍊錶從頭節點到尾節點都是有序的 2.可以進行跳躍查詢(形如二分法),降低時間複雜度。3.以空間換時間

場景:主要可以使用排序

Redis底層資料結構?

福哥口訣法 簡鏈字跳整 壓快壓 sds synamic string 簡單動態字串。支援自動動態擴容的位元組陣列 list 鍊錶 雙端鍊錶。dict 字典。使用雙雜湊表實現的,支援平滑擴容的字典 zskiplist 跳躍表。附加了後向指標的跳躍表 intset 整數集合。用於儲存整數數值集合的自有結...

Redis底層資料結構

redis底層實現的8種資料結構 sds synamic string 支援自動動態擴容的位元組陣列 list 鍊錶 dict 使用雙雜湊表實現的,支援平滑擴容的字典 zskiplist 附加了後向指標的跳躍表 intset 用於儲存整數數值集合的自有結構 ziplist 一種實現上類似於tlv,但...

Redis底層資料結構

redis 開源,c語言編寫的key value資料庫 字串 redis中的字串並沒有直接使用c語言傳統的字串表示,而是自己構建了一種名為簡單動態字串 dynamic string sds 的抽象型別,並且將sds作為redis的預設字串表示,c字串和sds的區別 c 字串 sds獲取字串長度的複雜...