1. 程式人生 > 其它 >Redis原始碼分析(四)——Redis資料結構-整數集合

Redis原始碼分析(四)——Redis資料結構-整數集合

1. 整數集合特點

  1. 有序:集合中所有值按照從小到大順序排列。
  2. 不重複
  3. 可以儲存int16_t、int32_t、int64_t三種類型的整數

1. 資料結構

typedef struct intset{
  unit32_t encoding;
  unit32_t length;
  int8_t contents[];
} intset;
  • encoding:content陣列中儲存的整數型別(int16_t、int32_t、int64_t三者之一)
  • length:contents陣列中元素的個數
  • contents:整數陣列

2. 升級

整數集合中可以儲存int16_t、int32_t、int64_t這三種類型的整數,但在任一時刻,集合中所有元素的型別都是統一的。 如果當前集合儲存的元素是int16_t型別,當需要存入一個int32_t型別的整數時,Redis會分配一片新的記憶體空間,將每個元素的型別提升為int32_t,再將所有元素遷移至新陣列中。 這就是升級的過程。

3. 降級

一旦升級了之後,即使最大的那個元素已經刪除,集合元素也是不會降級的。

4. 整數集合優點

4.1 靈活

整數集合可以通過自動升級底層陣列來適應新元素,所以我們可以隨意地將int16_t、int32_t、int64_t型別的整數新增到集合中,而不必擔心型別錯誤。

4.2 節約記憶體

如果要用一個數組同時能夠儲存int16_t、int32_t、int64_t這三種類型的整數,那麼只能建立一個int64_t型別的陣列,而Redis整數集合可以儲存三種類型的整數,只有當有需要的時候才進行升級操作,因此節約了記憶體。