了解下Redis的SDS結構


SDS (簡單動態字符串)

sds是Redis里面的一種結構,通過它對字符串的操作進行了很多的優化操作。

SDS的結構定義

struct  stdhdr {
   int len  //記錄buff數組中已使用字節的數量
   int free //記錄buff數組中未使用字節的數量
   char buff[] //字節數組,用於保存字符串
}

SDS的示例,見下圖

free值為0, 表示這個SDS沒有分配任何未使用空間。
len值為4, 表示這個SDS保存一個四字節長的字符串。
buff值為一個char類型數組,分別保存’L‘,’i','a','n' 4個字符,最后一個字節保存;’\0‘

SDS與C字符串的區別

  1. C語言使用長度N+1的字符數組來表示長度為N的字符串,並且最后一個字符串總是空字符串’\0‘.
    ,而且它並不記錄自身的長度信息,如果要獲取,必須全部遍歷;但SDS不一樣,他有len屬性記錄了長度,所以獲取長度的復雜度很高。

  2. C字符串容易緩沖區溢出,而SDS的空間分配策略則不會,當需要操作字符串時,會先檢測空間大小,如果不滿足,則需要對空間做擴展。

  3. C在對字符串做修改時,因為沒有記錄長度信息,所以需要頻繁對內存做分配,而SDS通過free屬性來記錄未使用的空間,實現空間預分配和惰性空間釋放。

1 空間預分配

空間預分配用於優化SDS的字符串增長操作,當對SDS字符做修改時,不僅會分配所需要的空間,還會為SDS分配額外的未使用空間。

分配未使用空間策略如下

  1. 如果對SDS操作后,SDS的長度(len的值)小於1M,那么程序分配和len同樣大小的未使用空間。
  2. 如果對SDS操作后,SDS的長度(len的值)大於等於1M,那么程序會分配1M的未使用空間。

惰性空間釋放

惰性空間釋放用於優於SDS的字符串縮短操作,當縮短SDS字符串時,程序不立即使用內存重分配回收多出來的字節,而是用free屬性記錄,下交要用時,查看 free的大小,避免重復分配了。

  1. C字符串不能包含空字符,所以它只能保存文本數據,不能保存圖片、音頻、視頻等二進制數據,而SDS都會處理二進制的方式來處理buff數組里面的數據,也不會對數據做任何限制、過濾等,存取數據一致。

  2. 雖然SDS是二進制安全的,但字符串結尾和C一樣,也是以空字符串作結尾。這樣就能兼容一部分C字符串函數了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM