Redis深入(—)

來源:互聯網
上載者:User

標籤: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深入(—)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.