Redis的數據結構-string

string是最基礎的數據結構,其底層實現(xiàn)為簡單動態(tài)字符串(Simple Dynamic String,SDS)
其結構,分為三部分

三部分.png

len存儲buf的已用長度
alloc存儲buf實際分配長度
buf就是我們寫入的value內容,為了標示結束,會自動在最后加上\0,多占據1字節(jié)空間

因為 Redis 的數據類型有很多,而且,不同數據類型都有些相同的元數據要記錄(比如最后一次訪問的時間、被引用的次數等),所以,Redis 會用一個 RedisObject 結構體來統(tǒng)一記錄這些元數據,同時指向實際數據

一個 RedisObject 包含了 8 字節(jié)的元數據和一個 8 字節(jié)指針,這個指針再進一步指向具體數據類型的實際數據所在,例如指向 String 類型的 SDS 結構所在的內存地址

同時,Redis 會使用一個全局哈希表保存所有鍵值對,哈希表的每一項是一個 dictEntry 的結構體,用來指向一個鍵值對。dictEntry 結構中有三個 8 字節(jié)的指針,分別指向 key、value 以及下一個 dictEntry,三個指針共 24 字節(jié),Redis 使用的內存分配庫 jemalloc 在分配內存時,會根據我們申請的字節(jié)數 N,找一個比 N 大,但是最接近 N 的 2 的冪次數作為分配的空間,這樣可以減少頻繁分配的次數,因此,一個dictEntry 實際會占用32字節(jié)。


32字節(jié).png

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

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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容