查漏補缺(二):Redis數據結構實現原理

string

string用於進行最簡單的key-value存儲。redis是使用C語言來實現的,但它並不是直接使用C語言的char數組來實現string。它其實維護了一個叫SDS的結構,這個結構內部封裝了一個char數組,還有一個字符串長度值,和一個剩餘長度。這樣做的優點是:
1.使得計算字符串長度的時間複雜度變爲常數級別。因爲C語言中計算長度需要遍歷整個數組
2.保證二進制安全。在C語言中字符串以“/0”標記結尾,這樣就無法儲存一些圖像信息。使用sds可以按照維護的字符串長度來劃分出字符串,而不需要說根據某一個字符來劃分。

list

list是基於ziplist(壓縮鏈表)或者quicklist(快速鏈表)來完成的。
壓縮鏈表可以節省內存,但它原理並不是對數據進行壓縮,而是對數據進行編碼之後,存儲在一個連續的內存地址上,達到節省內存的目的
快速鏈表,底層其實就是一個雙向鏈表

Hash

是基於dict字典來實現的,字典其實就是一個哈希表,以一個結點數組的方式來實現,因爲它是使用鏈地址法來解決哈希衝突的,所以這個結點就是一個鏈表結點。裏面有key,value屬性,還有一個next指針

set

Set也是基於dict字典來實現的,它其實就是利用結點的key值不允許重複這個特點來實現自己不允許存儲相同的值這個功能。

zset

排序set。利用了跳錶來實現的。
跳錶有多層次的結構,其實每層都是一條鏈表,並且上下鏈表的對應位置結點會有一個指針進行連接,完成從上到下的一個跳轉。
每次進行查詢的時候,會從上到下進行遍歷。類似於多叉搜索樹的思想。就是這樣來保證順序性。

新版本還有了三種新的數據類型:位圖,超日誌,流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章