SDS (Simple Dynamic String,簡單動態(tài)字符串)是 Redis 底層所使用的字符串表示.
SDS 在 Redis 中的主要作用有以下兩個:
用 sds 取代 C 默認的 char* 類型
因為 char* 類型的功能單一, 抽象層次低, 并且不能高效地支持一些 Redis 常用的操作(比如追加操作和長度計算操作), 所以在 Redis 程序內部, 絕大部分情況下都會使用 sds 而不是 char* 來表示字符串。
在 C 語言中,字符串可以用一個 結尾的 char 數(shù)組來表示。
比如說, hello world 在 C 語言中就可以表示為 “hello world” 。
這種簡單的字符串表示,在大多數(shù)情況下都能滿足要求,但是,它并不能高效地支持長度計算和追加(append)這兩種操作:
- 每次計算字符串長度(strlen(s))的復雜度為 θ(N)θ(N)θ(N)θ(N) 。
- 對字符串進行 N 次追加,必定需要對字符串進行 N 次內存重分配(realloc)。
在 Redis 內部, 字符串的追加和長度計算很常見, 而 APPEND 和 STRLEN 更是這兩種操作,在 Redis 命令中的直接映射, 這兩個簡單的操作不應該成為性能的瓶頸。
另外, Redis 除了處理 C 字符串之外, 還需要處理單純的字節(jié)數(shù)組, 以及服務器協(xié)議等內容, 所以為了方便起見, Redis 的字符串表示還應該是二進制安全的: 程序不應對字符串里面保存的數(shù)據(jù)做任何假設, 數(shù)據(jù)可以是以 結尾的 C 字符串, 也可以是單純的字節(jié)數(shù)組, 或者其他格式的數(shù)據(jù)。
考慮到這兩個原因, Redis 使用 sds 類型替換了 C 語言的默認字符串表示: sds 既可高效地實現(xiàn)追加和長度計算, 同時是二進制安全的。