Redis核心原理-簡單動態字符串SDS

SDS簡介

Redis是C語言編寫的,但沒有使用c語言的字符串結構,而是本身實現了一套簡單動態字符串 simple dynamic string 簡稱SDS,SDS兼容C語言的字符串類型,原理相似Java的ArrayList,擴容和縮短長度時能夠減小內存頻繁分配。數組

SDS用途

  • 包含字符串的鍵、值底層是用SDS實現
  • 持久化AOF的緩衝區實現

SDS屬性原理

//記錄buf數組中已使用字節的數量
  //等於SDS所保存字符串的長度
  int len;
  
  //記錄buf數組中未使用字節的數量
  int free;
  
  //字節數組,用於保存字符串
  char buf[];

len

表示SDS所保存字符串的長度,獲取字符串長度高效,時間複雜度爲O(1)優化

buf[]

保存字符串的二進制數據,長度 = 字符數量 + 1(空字符)+ freecode

free

記錄buf數組中未使用字節的數量,能夠減小修改字符串帶來的內存重分配次數;優化策略有空間預分配和惰性空間釋放內存

空間預分配

擴大SDS空間時(好比兩個字符串拼接)使用空間預分配不用隨時分配內存,預分配規則爲 len 小於 1M 時,free = len; len 大於1M 時 free = 1M字符串

惰性空間釋放

縮短SDS空間時(好比剪切字符串)不當即回收內存,使用free來記錄縮短長度,等待未來使用,避免內存浪費string

相關文章
相關標籤/搜索