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字串的區別
-
C語言使用長度N+1的字符陣列來表示長度為N的字串,并且最后一個字串總是空字串’\0‘.
,而且它并不記錄自身的長度資訊,如果要獲取,必須全部遍歷;但SDS不一樣,他有len屬性記錄了長度,所以獲取長度的復雜度很高, -
C字串容易緩沖區溢位,而SDS的空間分配策略則不會,當需要操作字串時,會先檢測空間大小,如果不滿足,則需要對空間做擴展,
-
C在對字串做修改時,因為沒有記錄長度資訊,所以需要頻繁對記憶體做分配,而SDS通過free屬性來記錄未使用的空間,實作空間預分配和惰性空間釋放,
1 空間預分配
空間預分配用于優化SDS的字串增長操作,當對SDS字符做修改時,不僅會分配所需要的空間,還會為SDS分配額外的未使用空間,
分配未使用空間策略如下
- 如果對SDS操作后,SDS的長度(len的值)小于1M,那么程式分配和len同樣大小的未使用空間,
- 如果對SDS操作后,SDS的長度(len的值)大于等于1M,那么程式會分配1M的未使用空間,
惰性空間釋放
惰性空間釋放用于優于SDS的字串縮短操作,當縮短SDS字串時,程式不立即使用記憶體重分配回收多出來的位元組,而是用free屬性記錄,下交要用時,查看 free的大小,避免重復分配了,
-
C字串不能包含空字符,所以它只能保存文本資料,不能保存圖片、音頻、視頻等二進制資料,而SDS都會處理二進制的方式來處理buff陣列里面的資料,也不會對資料做任何限制、過濾等,存取資料一致,
-
雖然SDS是二進制安全的,但字串結尾和C一樣,也是以空字串作結尾,這樣就能兼容一部分C字串函式了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/79319.html
標籤:PHP
