這篇文章主要介紹Redis中SDS和C字符串的區別有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
redis底層沒有使用“C字符串”來表示,而是用自己構建的“SDS抽象類型”進行默認字符串表示。
C字符串儲存的數據,最后會有一個空字符結尾. 舉個例子,比如說 "redis" 他實際的形式就是 'R' 'E' 'D' 'I' 'S' '\0'
SDS 是 redis 構建的一種抽象類型,主要用于儲存 redis 的默認字符串表示、AOF 模塊中的 AOF 緩沖區、客戶端狀態輸入緩沖區。
SDS抽象類型內容有:
int len, 用來記錄字符串的長度
int free, 用來記錄buf數組中未使用的字節的數量
char buf[],字節數組用來保存字符串
SDS結構如下圖所示
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字符串的區別有哪些”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。