redis中所有字串都是用sds(簡單動態字串)實現的,該結構體內部定義如下:
struct sdshdr;
關於sds的特點,可以總結為以下幾點:
1. sds遵循c字串以空字元結尾的風格,相容部分c字串函式,buf在末尾缺省會帶上乙個『\0』字元,但是不會計算到len欄位裡面,因此buf的實際大小為len+free+1(1表示'\0'字元)。
2. 因為有len欄位的存在,所以計算字串長度的複雜度為o(1),這點跟c++的string類相似。
3. sds對記憶體的管理採用了2種策略:
(1)空間預分配:
如果在對sds進行修改時發現修改後的字串長度(這裡假設為new_len)不會超過修改前len與free的總和,就直接在原空間上進行操作,不需要堆記憶體進行重分配。反之,redis就會對空間進行擴充套件,在將len修改為new_len的同時,分配min(1mb, new_len)的空間給free欄位(buf未用位元組數),即新的buf實際可容納最大位元組數為new_len+min(1mb, new_len)+1。
(2)惰性釋放:
如果對sds進行字串縮短操作,不立即使用記憶體重分配來**縮短之後多出來的位元組,而是記錄在free欄位,留給以後擴充套件的時候用。當然,redis也提供了適當的api讓我們可以在必要的時候進行記憶體釋放。
4. sds的api是二進位制安全的,因為sds使用len欄位來判斷字串是否結束而不是'\0'。
redis資料結構 SDS
在使用中,redis有五種物件 string hash list set sorted set 在redis中有以下幾種資料結構 sds 鍊錶 字典 跳躍表 整數集合 壓縮列表,它們在不同的條件下實現了redis的五種物件。先來看sds的結構 在sds.h中定義了幾種不同的結構用來存放不同型別的資料...
redis資料結構 SDS
sds結構體組成 struct sdshdr sds相比普通字串的好處 redis 只會使用c字串作為字面量,在大多數情況下,redis 使用sds dynamic string,簡單動態字串 作為字串表示。比起 c 字串,sds 具有以下優點 常數複雜度獲取字串長度。杜絕緩衝區溢位。減少修改字串長...
Redis資料結構 一 SDS
redis沒有直接使用c語言傳統的字串表示 空字元結尾的字元陣列 而是自己構建了一種名為簡單動態字串的抽象型別,並將sds用作redis的預設字串表示 在redis裡面,c字串只會作為字串字面量,用在一些無須對字串值進行修改的地方,比如列印日誌.但當可能會修改字串值時,就需要sds來實現字串,比如,...