《Redis設計與實現》讀書筆記(一)
第一部分 數據結構與對象
- Redis是鍵值數據庫。鍵一般是字符串對象,值有五種可能的對象:字符串,列表,哈希,集合,有序集合。第一部分是介紹這五種對象,剖析其底層數據結構,以及該數據結構對其功能和性能的影響
- Redis是由C語言編寫,因此出現的源碼皆爲C語言,其餘語言會另外聲明。
1. 簡單動態字符串(simple dynamic string,SDS)
- Redis中的string對象是根據Redis的功能專門設計的,沒有直接使用C字符串。SDS會被用做字符串對象的底層實現。SDS定義以下。
-
這樣設計有什麼好處呢?數據庫
- 比C字符串更快獲取長度
- C字符串在拼接的時候可能出現緩衝區溢出的問題,而SDS結構的API會檢查free字段的值,看是否須要擴展緩衝區。這就避免了緩衝區溢出問題
- Redis做爲數據庫,在設計的時候,必定是假設數據會被常常訪問和修改。那C字符串在append和trim的過程當中會觸發內存重分配。添加length和free字段能夠有效減小內存重分配的壓力。Redis有一套機制。總的來講就是append的時候預留空間,trim的時候不急着歸還內存,以備不時之需。具體的數值自行查閱原文或其餘相關資料。
- 在保存圖像,音頻等二進制數據的時候,C字符串只能勝任保存文本數據,SDS會以處理二進制的方式處理buf數組的數據。例如,SDS使用len屬性判斷字符串是否結束,而不是空字符串。
- 此外SDS還被設計成兼容部分C字符串的函數,避免了重複造輪子。
2.鏈表
- C語言沒有內置鏈表,Redis在開發的過程當中構建了本身的鏈表實現。此處的鏈表跟數據結構課上講到的鏈表無太大區別。Node定義以下。
- NodeList 定義以下。
- 相對應的,Redis的設計者們給鏈表設計了豐富的API。
- 鏈表在Redis中的實際應用:列表鍵,發佈和訂閱,慢查詢,監視器等
歡迎關注本站公眾號,獲取更多信息