前言:
在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 是如何操作的。希望對大家有幫助, 謝謝!