Redis資料儲存結構之String
前言:
在Redis使用中,我們最常使用的操作是set key value,或 get key value 。這裡麵包含了redis最基本的資料型別:String,字串型別是redis中最基本的型別,它能儲存任何形式的字串,包括二進位制資料(JSON,Image...)。
大家有沒有思考過redis是通過何種資料結構來儲存資料的呢?今天來帶大家一探究竟。
原始碼開啟方式:
開啟我們下載好的redis原始碼包,進入src目錄,思考,怎麼才能知道哪一個是String的結構型別的原始碼呢? 然後我們慢慢找,慢慢找, 哪一個像String的結構型別的原始碼呢? 誒,大兄嘚, 找到了, 這個sds.c像是String的原始碼,哈哈哈哈哈哈哈哈哈哈哈哈哈,真是機智! 實時證明,這是一種效率極其低下的方式。
正確的開啟原始碼的方式是,查詢官方文件。在Redis官方頁面中,有Quick links,有官方的Github. 我們進入GitHub。在GitHub中,有對原始碼的簡要描述。我們通過往下翻,找到如下描述:
我們可以看到官方介紹的很清楚,sds.c是Redis的字串庫。接下來,我們就可以快樂的去看原始碼了。
原始碼剖析:
part1: sds.h
在原始碼包中,有sds.c和sds.h檔案。在C語言中,.h檔案一般為標頭檔案,.c為原始檔。在原始檔中可以呼叫標頭檔案中定義的變數,結構體,等一些資料或資料型別。所以我們先檢視一下標頭檔案定義的資料型別。
在檔案頭中定義了5種結構體,分別是:sdshdr5,sdshdr8,sdshdr16,32,64,每種結構體中的資料型別相同(當然,長度定義的不同)。每個引數具體的含義(暫時不考慮sdshdr5,上面寫的很清楚,sdshdr5 is never used.):
- len:表示當前sds的長度,
- alloc:表示為sds分配的記憶體大小
- flag:用來表示當前sds的型別。如上圖所示 001,010,011,100分別為8,16,32,64
- char buf[]:sds實際存放的資料
當然,標頭檔案中還定義了許多方法,通過名稱我們可以大概知其意。如:static inline size_t sdslen(const sds s) 獲取sds的長度, static inline void sdsinclen(sds s, size_t inc) 長度+1,還有許多。
part2:sds.c
在sds.c中,引用了sds.h中定義的資料結構,已申明的方法和已實現的方法等。此檔案中主要定義了對sds資料結構的具體操作,如:初始化方式,設定sds的len,等一些列操作,感興趣的可以具體研究下原始碼。此處不一一詳解啦(水平有限,誤導不好)。
結束語
通過本文,瞭解了Redis中儲存String型別採用的資料結構,以及資料結構中具體的資料,引數等,還有String 是如何操作的。希望對大家有幫助, 謝謝!
&n