前言
Redis 沒有直接使用 C 語言傳統的字串表示(以空字符結尾的字符陣列,以下簡稱 C 字串), 而是自己構建了一種名為簡單動態字串(simple dynamic string,SDS)的抽象型別, 并將 SDS 用作 Redis 的默認字串表示,
個人感覺SDS類似于Java的ArrayList,大家可以拿兩者對比一些,誰的效率更加高一點,
SDS定義
1 struct sdshdr { 2 3 // 記錄 buf 陣列中已使用位元組的數量 4 // 等于 SDS 所保存字串的長度 5 int len; 6 7 // 記錄 buf 陣列中未使用位元組的數量 8 int free; 9 10 // 位元組陣列,用于保存字串11 char buf[];12 13 };
這里注意一下,C語言的char是占一個位元組的,不像Java的char占兩個位元組,也就是只有八位,-127 - 128,
SDS相比于C字串的優勢
1. 常數復雜度獲取字串長度
- 這個比較好理解,因為SDS里面有一個欄位為len,可以直接獲取長度
2. 減少修改字串時帶來的記憶體重分配次數
- 因為傳統的c字串,不會自動擴容,而且其記憶體大小就等于字串長度+1,因此,每修改一次字串,都要重新分配一次記憶體,非常的耗費時間
- SDS會自動擴容,并且會進行空間預分配,比如現在有一個Hello的字串,記憶體的大小可能是Hello的兩倍,也就是 5 * 2 = 10,當再次擴容字串的時候,不一定需要再次分配記憶體了,并且可以自動擴容,假設10不夠了,加了一個字串后大小為13,那么記憶體就會分配為 13 * 2 = 26大小的記憶體,
3. 二進制安全,以及可以保存空字符
- C 字串中的字符必須符合某種編碼(比如 ASCII), 并且除了字串的末尾之外, 字串里面不能包含空字符, 否則最先被程式讀入的空字符將被誤認為是字串結尾 —— 這些限制使得 C 字串只能保存文本資料, 而不能保存像圖片、音頻、視頻、壓縮檔案這樣的二進制資料,
- 因此,所有 SDS API 都會以處理二進制的方式來處理 SDS 存放在
buf陣列里的資料 - 也就是保存在buf陣列里面的所有東西,不論英文中文,還是圖片音頻,都是二進制資料流,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/37922.html
標籤:NoSQL
下一篇:Redis 介紹學習
