面試題解 - Redis 的 String 是如何實現的?

作者丨安琪拉的博客

來源丨安琪拉的博客

第 44 題: Redis 的 String 是怎麼實現的?爲什麼不直接用 c 的字符串?

Redis 沒有直接使用 C 語言的字符串表示,而是自己構建一種簡單動態字符串(SDS: simple dynamic string)。

Redis 中的 String 都是 SDS,例如我們執行這樣一條命令:

redis> SET blog angela

那麼 Redis 在內存中創建了一個鍵值對,

如果執行

redis> RPUSH blog "angela" "de" "blog"

那麼 Redis 將在內存中創建一個鍵值對,鍵還是一個 SDS,存放 “blog”,值是一個列表,存放三個 SDS,“angela”、“de”、“blog”

SDS 如何實現的呢?

首先 SDS 被定義爲這樣一個結構體:

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

舉個例子:

現有執行redis> SET blog angela 命令後,value 值在 redis 中存放如下圖所示,buf 存放字節數組 (真實數據),len 表示存放字符串的長度(不包括結束符號'\0'),free 表示剩餘空間,可以看到還剩 5 個字節。

SDS 遵循了 C 語言字符串以空字符結尾的慣例,保存空字符的 1 個字節空間不在 SDS 的 len 屬性裏面。這樣做有個好處是我們直接可以複用 C 提供的庫函數,比如打印字符串,直接用 C 提供的printf("%s", s->buf);

那又是爲什麼不直接用 C 語言提供的字符串呢?

在 C 語言中,表示一個 “angela” 的字符串如下圖所示,結束也是通過空字符表示:

C 語言的字符串和 SDS 的區別如下:

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/3qEXdoZ8SIujoSff2mwGAw