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

 

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