Redis深入之簡單動態字串

2021-06-27 17:05:39 字數 1016 閱讀 3992

一、redis鍵值對

redis資料庫裡面的每個鍵值對(key-value)都是由物件組成的,鍵是乙個字串物件,值是字串物件,列表物件,雜湊物件,集合物件,有序集合物件中的五種之一。

redis沒有直接使用c語言傳統的字串表示,而是自己構建了乙個名為簡單動態字串sds的抽象型別,並將sds用作redis的預設字串表示。

set msg 「helloworld」

鍵是乙個字串物件,物件的底層實現是乙個儲存著字串」msg」的sds

值是乙個字串物件,物件的底層實現是乙個儲存著字串」hello world」的sds

二、sds的定義

每個sds.h/sdshdr結構表示乙個sds值

struct sdshdr

free屬性的值為0,表示這個sds沒有分配任何未使用空間。

len屬性的值為5,表示這個sds儲存了乙個五位元組長的字串

三、與c字串的區別

1、 c語言使用長度為n+1的字元陣列來表示長度為n的字串,並且字元陣列最後乙個元素總是空字元『\0』

c字串並不記錄自身的長度資訊,所以為了獲取乙個c字串的長度,必須遍歷整個字串,o(n),sds因為記錄了sds本身的長度,故複雜度僅為o(1)。

2、杜絕緩衝區溢位

c可能在字串拼接時造成緩衝區溢位,sds的空間分配策略完全杜絕了發生緩衝區溢位的可能性:當sds api需要對sds進行修改時,api會先檢查sds的空間是否滿足修改所需的要求,如果不滿足的話,api會自動將sds的空間擴充套件至執行修改所需的大小,然後才執行實際的修改操作。

3、減少修改字串時帶來的記憶體重分配次數

對於c字串來說,如果程式執行的是增長字串的操作或縮短字串的操作,程式需要通過記憶體重分配來分配或釋放字串不再使用的那部分空間。sds中,buf陣列的長度不一定就是字元數量加一,陣列裡面可以包含未使用的位元組,而這些位元組的數量就由sds的free屬性記錄。

4、二進位制安全

sds的buf屬性稱為位元組陣列,redis不是用這個陣列來儲存字元,而是用它來儲存一系列二進位制資料。

Redis之簡單動態字串

sds的介紹 redis中字串並沒有使用c語言傳統的字串,而是構建了一種名為簡單動態字串 sds sds是redis的預設字串標識。redis裡面的c語言字串用在一些無需對字串值進行修改的地方,例如列印日誌redislog redis warning,redis is now ready to ex...

Redis之簡單動態字串 SDS

簡單動態字串sds dynamic string sds資料結構如下 struct sdshdr基於sds資料結構的定義和一些api規則,sds相比於c字串有如下優勢 1.獲取字串長度的複雜度為o 1 c字串的複雜度為o n 2.杜絕緩衝區溢位 3.減少修改字串時帶來的記憶體重分配次數 4.二進位制...

Redis之簡單動態字串(SDS)

redis沒有直接使用c語言傳統的字串表示,而是自己構建一種名為簡單動態字串 sds 的抽象型別,並將sds用作redis的預設字串表示。在redis的資料庫中,包含字串值得鍵值對在底層都是又sds實現的。比如reids set msg hello world ok在客戶端中執行這樣的命令,redi...