標籤:style ar 使用 sp on 資料 bs size nbsp
一、Redis鍵值對
Redis資料庫裡面的每個鍵值對(key-value)都是由對象組成的,鍵是一個字串對象,值是字串對象,列表對象,雜湊對象,集合對象,有序集合對象中的五種之一。
Redis沒有直接使用C語言傳統的字串表示,而是自己構建了一個名為簡單動態字串SDS的抽象類別型,並將SDS用作Redis的預設字串表示。
SET msg “helloworld”
鍵是一個字串對象,對象的底層實現是一個儲存著字串”msg”的SDS
值是一個字串對象,對象的底層實現是一個儲存著字串”hello world”的SDS
二、SDS的定義
每個sds.h/sdshdr結構表示一個SDS值
struct sdshdr
{
//記錄buf數組中已使用位元組的數量,等於SDS所儲存字串的長度
int len;
//記錄buf數組中未使用位元組的數量
int free;
//位元組數組,用於儲存字串
char buf [];
}
free屬性的值為0,表示這個SDS沒有分配任何未使用空間。
Len屬性的值為5,表示這個SDS儲存了一個五位元組長的字串
三、與C字串的區別
1、 C語言使用長度為N+1的字元數組來表示長度為N的字串,並且字元數組最後一個元素總是Null 字元‘\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深入(—)