1. 程式人生 > >Redis的動態字串物件SDS

Redis的動態字串物件SDS

字串物件

  • 簡單動態字串SDS
    • 用途
      • 鍵值物件
      • 緩衝區
        • AOF緩衝區
        • 客戶端的輸入緩衝區
    • 定義
      • len 已使用的長度
      • free 未使用的位元組數量
      • buf[] char陣列 儲存字元
    • 注意
      • O(1)時間複雜度獲取字串長度
      • 防止緩衝區溢位,會自動擴充套件空間。
        • 記憶體溢位
        • 記憶體洩漏
      • 為了解決以上問題 採用未使用空間的兩種優化策略
        • 空間預分配
          • SDS修改後的長度小於1MB,將分配與len相同大小的值給未使用空間free.
          • 如果修改之後的值大於等於1MB,將會分配1MB給未使用空間,例如修改後SDS的len變為30MB,buf陣列的實際長度為30MB+1MB+1byte(儲存空字串)
          • 擴充套件SDS的空間前將會 檢查未使用空間是否足夠,若足夠無須進行記憶體分配。
        • 惰性空間釋放
          • 用於優化字串縮短操作。
          • 當api操作縮短SDS的字串時,並不立即使用記憶體分配來回收多餘的位元組,將其記錄在free以便後面使用。
      • 二進位制安全
        • 都是以二進位制的方式來處理資料不會對其進行過濾和任何限制
  • 小結
    • Redis使用SDS作為字串的表示
    • SDS以 0(1) 的時間複雜度獲取字串長度
    • 能夠杜絕緩衝區溢位
    • 減少因字串修改帶來的記憶體重新分配的次數
    • 二進位制安全
    • 相容部分C字串API
  • 參考《Redis設計與實現》