溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis中SDS和C字符串的區別有哪些

發布時間:2021-04-29 11:19:39 來源:億速云 閱讀:364 作者:小新 欄目:關系型數據庫

這篇文章主要介紹Redis中SDS和C字符串的區別有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

redis底層沒有使用“C字符串”來表示,而是用自己構建的“SDS抽象類型”進行默認字符串表示。

C字符串

C字符串儲存的數據,最后會有一個空字符結尾. 舉個例子,比如說 "redis" 他實際的形式就是  'R' 'E' 'D' 'I' 'S' '\0'

SDS(動態字符串)

SDS 是 redis 構建的一種抽象類型,主要用于儲存 redis 的默認字符串表示、AOF 模塊中的 AOF 緩沖區、客戶端狀態輸入緩沖區。

SDS抽象類型內容有:

  • int len, 用來記錄字符串的長度

  • int free, 用來記錄buf數組中未使用的字節的數量

  • char buf[],字節數組用來保存字符串

SDS結構如下圖所示

Redis中SDS和C字符串的區別有哪些

區別

1、在求長度的時候

C字符串要進行遍歷才可以知道該字符串的長度 復雜度 O(n).

SDS只需要訪問內部的len屬性即可 時間復雜度O(1).

2、緩沖區溢出問題

C字符串 設置了一個S1為 “redis” ,但是底層有一個跟他相鄰的S2為“abc”,然后這里如果通過函數 strcat 把S1拼接S3 "ccc",然后最后結果應該是 “redisccc”, 但是如果本身給S1設置內存不夠的話,這樣會導致把與它相鄰的S2進行修改。

SDS 這里會先根據空間是否夠用,不夠則擴展空間到夠位置,并且會多添加len長度的free未使用的空間,比如說redis字符串的長度為5,然后還會空間預分配同等的長度5,最后實際空間長度為 free + len + 1 為 10。

3、字符串內存分配

c字符串,當給某個字符串加數據或減少數據的時候, 就會重新申請內存 但是如果過多的申請必然會導致性能的下降,更改N次則分配N次。

SDS 內部使用兩種機制 惰性空間釋放跟空間預分配

空間預分配:

空間預分配:指當我們進行一次空間分配以后,我們會在原有基礎上再多分配len長度的空間

這里SDS長度小于1M的時候是 free = len,舉個例子若SDS長度為 6byte 則實際的空間為 6byte + 6byte + 1byte

大于1M的時候只會多分配1M。free = 1M, 舉個例子若SDS長度為60M 則實際空間為 60M + 1M + 1byte

惰性空間釋放

當我們對某個字符串進行減少的時候,程序并不立即使用內存重新分配來回收縮短后的字節,而是通過free記錄起來,以供后續使用,SDS也提供了相應的API,防止惰性空間導致內存浪費。

4、二進制安全

c字符串最后是由空字符結尾,但是如果有些特殊的數據需要空字符,會導致數據無法保存會導致提前識別第一個空字符之前的數據。 SDS 因為SDS是根據長度來進行識別字符串的所以可以保證數據的正確。

5、兼容部分C語言的函數 因為SDS也遵循C的以空字符為結尾,所以它可以使用C里面的一些函數

總結

Redis中SDS和C字符串的區別有哪些

以上是“Redis中SDS和C字符串的區別有哪些”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女