Redis的動態字串物件SDS
阿新 • • 發佈:2018-11-19
字串物件
- 簡單動態字串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設計與實現》