redis 底層原理之動態字串SDS

2021-10-07 05:50:39 字數 1050 閱讀 7347

既然c語言支援字串,為啥要有sds的出現?

c語言的字串的缺點:

獲取欄位串的長度為0(n),因為每次都遍歷獲取欄位串的長度大小。

strcat 函式來進行兩個字串的拼接,一旦沒有分配足夠長度的記憶體空間,就會造成緩衝區溢位。

c字元不能有空字串,否則認為空字串結尾,如"i am boy" ,c字元只能識別到 i ,遇到空格認為是字串的結尾,而且限定只能符合某種編碼,這就有很大的侷限性了。

sds的優點

1.sds記錄字串的長度,獲取大小的時間複雜度為0(1)

2.使用新的函式sdscat來拼接字串,因為預先知道當前陣列的分配大小,只要檢查連線字元空間不夠,重新申請記憶體自,從而避免了緩衝區的記憶體溢位。

3.申請記憶體的時候保留一定的空閒空間,這樣可以減少修改字串時帶來的記憶體重分配次數。

4.sds可以儲存帶有空格的字串,類似"i am boy"是完全沒有問題的。因為sds字串是以二進位制方式儲存的,不會對原本字元做任何轉換,所以sds是二進位制安全的,符合這一點是sds出了儲存字串之外,還可以儲存任何格式的二進位制資料。

sds是通過空間換時間提高字串的修改效率

redis作為資料庫,對字串的修改肯定很頻繁,sds出現是redis為了修復c語言原生函式的缺陷。對於字元的修改,字串的長度出現兩種可能.

要麼變長

對於字串修改變長而言,sds預分配一定的空間,盡最大的可能性不需要重新申請記憶體空間。因為重新分配記憶體涉及複雜的演算法,可能驚動作業系統,是乙個非常耗時的操作。減少申請記憶體的次數,可以盡可能提公升修改字串效率。

要麼變短。

對於字串修改變短而言,sds是策略是惰性空間釋放。見名思議,惰性就是懶得釋放,僅僅是把變短的多出來的空間記錄到空閒空間裡面,留到將來使用。當然這個是預設的策略,redis提供api強制釋放多出來的空間,避免大字串縮短造成多餘的空間浪費。

通過以上兩種策略,sds將修改字元的重新分配次數空間盡可能降低。

Redis之簡單動態字串

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

Redis字串的底層設計

redis的底層是用c語言來實現的,在c語言中字串的預設是以 0 標識結束,而redis並沒有採用這種傳統的方法表示,而是自己構建了一種簡單動態字串 sds 來表示。下面看一下什麼是sds,sds的 定義,以及在儲存乙個字串 redis 時sds和傳統c的表示分別是怎麼樣,使用sds的好處是什麼 s...

Redis深入之簡單動態字串

一 redis鍵值對 redis資料庫裡面的每個鍵值對 key value 都是由物件組成的,鍵是乙個字串物件,值是字串物件,列表物件,雜湊物件,集合物件,有序集合物件中的五種之一。redis沒有直接使用c語言傳統的字串表示,而是自己構建了乙個名為簡單動態字串sds的抽象型別,並將sds用作redi...