天天看點

Redis的資料結構-string

string是最基礎的資料結構,其底層實作為簡單動态字元串(Simple Dynamic String,SDS)

其結構,分為三部分

Redis的資料結構-string

len存儲buf的已用長度

alloc存儲buf實際配置設定長度

buf就是我們寫入的value内容,為了标示結束,會自動在最後加上\0,多占據1位元組空間

因為 Redis 的資料類型有很多,而且,不同資料類型都有些相同的中繼資料要記錄(比如最後一次通路的時間、被引用的次數等),是以,Redis 會用一個 RedisObject 結構體來統一記錄這些中繼資料,同時指向實際資料

一個 RedisObject 包含了 8 位元組的中繼資料和一個 8 位元組指針,這個指針再進一步指向具體資料類型的實際資料所在,例如指向 String 類型的 SDS 結構所在的記憶體位址

同時,Redis 會使用一個全局哈希表儲存所有鍵值對,哈希表的每一項是一個 dictEntry 的結構體,用來指向一個鍵值對。dictEntry 結構中有三個 8 位元組的指針,分别指向 key、value 以及下一個 dictEntry,三個指針共 24 位元組,Redis 使用的記憶體配置設定庫 jemalloc 在配置設定記憶體時,會根據我們申請的位元組數 N,找一個比 N 大,但是最接近 N 的 2 的幂次數作為配置設定的空間,這樣可以減少頻繁配置設定的次數,是以,一個dictEntry 實際會占用32位元組。

Redis的資料結構-string

綜上,一個redis中存儲一個string類型的值,我們不考慮存儲的value自身的大小,光這些額外開支,就需要占用49位元組,實際使用的時候,根據我們value的長度不同,還會有不同的空間因為jemalloc 的配置設定政策被浪費

啟示:string資料類型不适合存儲極大量的key,當key的量很大的時候,string資料類型的額外空間開支會很大

繼續閱讀