# 簡單動態字符串
Redis 沒有直接使用 C 語言傳統的字符串表示(以空字符結尾的字符數組,以下簡稱 C 字符串), 而是自己構建了一種名為簡單動態字符串(simple dynamic string,SDS)的抽象類型, 并將 SDS 用作 Redis 的默認字符串表示。
在 Redis 里面, C 字符串只會作為字符串字面量(string literal), 用在一些無須對字符串值進行修改的地方, 比如打印日志:
~~~
redisLog(REDIS_WARNING,"Redis is now ready to exit, bye bye...");
~~~
當 Redis 需要的不僅僅是一個字符串字面量, 而是一個可以被修改的字符串值時, Redis 就會使用 SDS 來表示字符串值: 比如在 Redis 的數據庫里面, 包含字符串值的鍵值對在底層都是由 SDS 實現的。
舉個例子, 如果客戶端執行命令:
~~~
redis> SET msg "hello world"
OK
~~~
那么 Redis 將在數據庫中創建了一個新的鍵值對, 其中:
* 鍵值對的鍵是一個字符串對象, 對象的底層實現是一個保存著字符串?`"msg"`?的 SDS 。
* 鍵值對的值也是一個字符串對象, 對象的底層實現是一個保存著字符串?`"hello?world"`?的 SDS 。
又比如說, 如果客戶端執行命令:
~~~
redis> RPUSH fruits "apple" "banana" "cherry"
(integer) 3
~~~
那么 Redis 將在數據庫中創建一個新的鍵值對, 其中:
* 鍵值對的鍵是一個字符串對象, 對象的底層實現是一個保存了字符串?`"fruits"`?的 SDS 。
* 鍵值對的值是一個列表對象, 列表對象包含了三個字符串對象, 這三個字符串對象分別由三個 SDS 實現: 第一個 SDS 保存著字符串?`"apple"`?, 第二個 SDS 保存著字符串?`"banana"`?, 第三個 SDS 保存著字符串?`"cherry"`?。
除了用來保存數據庫中的字符串值之外, SDS 還被用作緩沖區(buffer): AOF 模塊中的 AOF 緩沖區, 以及客戶端狀態中的輸入緩沖區, 都是由 SDS 實現的, 在之后介紹 AOF 持久化和客戶端狀態的時候, 我們會看到 SDS 在這兩個模塊中的應用。
本章接下來將對 SDS 的實現進行介紹, 說明 SDS 和 C 字符串的不同之處, 解釋為什么 Redis 要使用 SDS 而不是 C 字符串, 并在本章的最后列出 SDS 的操作 API 。
- 介紹
- 前言
- 致謝
- 簡介
- 第一部分:數據結構與對象
- 簡單動態字符串
- SDS 的定義
- SDS 與 C 字符串的區別
- SDS API
- 重點回顧
- 參考資料
- 鏈表
- 鏈表和鏈表節點的實現
- 鏈表和鏈表節點的 API
- 重點回顧
- 字典
- 字典的實現
- 哈希算法
- 解決鍵沖突
- rehash
- 漸進式 rehash
- 字典 API
- 重點回顧
- 跳躍表
- 跳躍表的實現
- 跳躍表 API
- 重點回顧
- 整數集合
- 整數集合的實現
- 升級
- 升級的好處
- 降級
- 整數集合 API
- 重點回顧
- 壓縮列表
- 壓縮列表的構成
- 壓縮列表節點的構成
- 連鎖更新
- 壓縮列表 API
- 重點回顧
- 對象
- 對象的類型與編碼
- 字符串對象
- 列表對象
- 哈希對象
- 集合對象
- 有序集合對象
- 類型檢查與命令多態
- 內存回收
- 對象共享
- 對象的空轉時長
- 重點回顧
- 第二部分:單機數據庫的實現
- 數據庫
- 數據庫鍵空間
- 重點回顧
- RDB 持久化
- RDB 文件結構
- 重點回顧
- AOF 持久化
- AOF 持久化的實現
- 重點回顧
- 事件
- 文件事件
- 重點回顧
- 參考資料
- 客戶端
- 客戶端屬性
- 重點回顧
- 服務器
- 命令請求的執行過程
- 重點回顧
- 第三部分:多機數據庫的實現
- 復制
- 舊版復制功能的實現
- 重點回顧
- Sentinel
- 啟動并初始化 Sentinel
- 重點回顧
- 參考資料
- 集群
- 節點
- 重點回顧
- 第四部分:獨立功能的實現
- 發布與訂閱
- 頻道的訂閱與退訂
- 重點回顧
- 參考資料
- 事務
- 事務的實現
- 重點回顧
- Lua 腳本
- 創建并修改 Lua 環境
- 重點回顧
- 排序
- SORT <key> 命令的實現
- 重點回顧
- 二進制位數組
- GETBIT 命令的實現
- 重點回顧
- 慢查詢日志
- 慢查詢記錄的保存
- 慢查詢日志的閱覽和刪除
- 添加新日志
- 重點回顧
- 監視器
- 成為監視器
- 向監視器發送命令信息
- 重點回顧
- 源碼、相關資源和勘誤