文章目錄
- 7. 數據類型的實現
- 8. 什么是空間預分配以及惰性空間釋放,SDS 是怎么實現的
- 9. 為什么說 SDS 是二進制安全的呢
- 10. 說說 redis 里的對象
- 11. 使用 RedisObject 的好處
- 12. RedisObject 的具體結構是什么
7. 數據類型的實現
8. 什么是空間預分配以及惰性空間釋放,SDS 是怎么實現的
首先,SDS 主要通過 未使用空間來實現的。
- 空間預分配,在 SDS 中的表現是,如果對 SDS 的長度進行修改,程序會多分配一部分的未使用空間,至于分配多少取決于
len
屬性,當len<1MB
時,會分配len
的未使用空間;否則分配1MB
。
如果未使用空間,足以放下修改后的字符,
len
是不會發生變化的。也就是說,空間的預分配把字符的重分配次數從 N 次,降為 最多 N 次。
- 惰性空間釋放,在 SDS 中的表現是,當字符串縮短時,并不立即釋放空間,而是保留為未使用空間,留待后續使用。(當然也可以手動釋放)。
9. 為什么說 SDS 是二進制安全的呢
因為 SDS 主要利用 buffer + len + free
,表示字符串,由底層的字符數組 buf
存儲字符,len
表示有效的字符長度,程序不會對 buffer
中數據進行任何的限制、過濾或者假設等操作。
10. 說說 redis 里的對象
對象也就是 redis 在底層數據結構之上包裝的一層 RedisObject(對象),常見的 RedisObject 有五種:字符串對象、列表對象、哈希對象、集合對象和有序集合對象。
11. 使用 RedisObject 的好處
使用 RedisObject 的優點主要有兩個,分別是:
- 通過不同類型的對象,Redis 可以在執行命令之前,根據對象的類型來判斷一個對象是否可以執行給定的命令。
- 我們可以針對不同的使用場景,為對象設置不同的實現,從而優化內存或查詢速度。
12. RedisObject 的具體結構是什么
typedef struct redisObject {// 類型unsigned type:4;// 編碼unsigned encoding:4;// 指向實際值的指針void *ptr;...} robj;