1、演示數據類型的實現
OBJECT ENCODING key
該命令是用來顯示那五大數據類型的底層數據結構剪决。
比如對于 string 數據類型:
我們可以看到實現string數據類型的數據結構有 embstr 以及 int。
再比如 list 數據類型:
2、簡單動態(tài)字符串
第一篇文章我們就說過 Redis 是用 C 語言寫的,但是對于Redis的字符串解幼,卻不是 C 語言中的字符串(即以空字符’\0’結尾的字符數組)闸拿,它是自己構建了一種名為 簡單動態(tài)字符串(simple dynamic string,SDS)的抽象類型,并將 SDS 作為 Redis的默認字符串表示书幕。
SDS 定義:
struct sdshdr{
//記錄buf數組中已使用字節(jié)的數量
//等于 SDS 保存字符串的長度
int len;
//記錄 buf 數組中未使用字節(jié)的數量
int free;
//字節(jié)數組新荤,用于保存字符串
char buf[];
}
用SDS保存字符串 “Redis”具體圖示如下:
我們看上面對于 SDS 數據類型的定義:
1、len 保存了SDS保存字符串的長度
2台汇、buf[] 數組用來保存字符串的每個元素
3苛骨、free j記錄了 buf 數組中未使用的字節(jié)數量
C語言由于不記錄字符串的長度,所以如果要修改字符串苟呐,必須要重新分配內存(先釋放再申請)痒芝,因為如果沒有重新分配,字符串長度增大時會造成內存緩沖區(qū)溢出牵素,字符串長度減小時會造成內存泄露严衬。
而對于SDS,由于len屬性和free屬性的存在笆呆,對于修改字符串SDS實現了空間預分配和惰性空間釋放兩種策略:
1请琳、空間預分配:對字符串進行空間擴展的時候,擴展的內存比實際需要的多赠幕,這樣可以減少連續(xù)執(zhí)行字符串增長操作所需的內存重分配次數俄精。
2、惰性空間釋放:對字符串進行縮短操作時榕堰,程序不立即使用內存重新分配來回收縮短后多余的字節(jié)竖慧,而是使用 free 屬性將這些字節(jié)的數量記錄下來,等待后續(xù)使用逆屡。(當然SDS也提供了相應的API圾旨,當我們有需要時,也可以手動釋放這些未使用的空間魏蔗。)
這次就先分享到這里砍的,更多干貨和資料請直接聯系我,也可以加群710520381沫勿,邀請碼:柳貓挨约,歡迎大家共同討論