整數集合簡介
整數集合(intset)是Redis集合資料型別的內部編碼之一,當集合資料型別中的元素都是整數并且元素數量較少的時候,Redis就使用整數集合作為內部編碼,
整數集合(intset)中可以保存int16_t、int32_t和int64_t型別的整數,而且保證整數集合中元素不會重復,
整數集合的結構
整數集合(intset)的結構中包含三個屬性:編碼方式(encoding)、元素數量(length)和元素陣列(contents),
- 編碼方式(encoding)表示當前整數集合的編碼方式,可以設定為:
INTSET_ENC_INT16、INTSET_ENC_INT32、INTSET_ENC_INT64, - 元素數量(length)表示當前整數集合的包含元素的數量,也就是保存元素的陣列的長度,
- 元素陣列(contents)保存了當前整數集合的所有元素,每一個元素都是陣列的一個陣列項,元素按照從小到大在陣列中排列,并且沒有重復的元素,
當編碼方式為INTSET_ENC_INT16的時候,元素陣列就是一個int16_t型別的陣列,陣列中的每個項都是int16_t型別的整數(最小值為$-2^{15}$ = -32,768,最大值為$2^{15} - 1$ = 32,767),
當編碼方式為INTSET_ENC_INT32的時候,元素陣列就是一個int32_t型別的陣列,陣列中的每個項都是int32_t型別的整數(最小值為$-2^{31}$ = -2,147,483,648,最大值為$2^{31} - 1$ = 2,147,483,647),
當編碼方式為INTSET_ENC_INT64的時候,元素陣列就是一個int64_t型別的陣列,陣列中的每個項都是int64_t型別的整數(最小值為$-2^{63}$ = -9,223,372,036,854,775,808,最大值為$2^{63} - 1$ = 9,223,372,036,854,775,807),
整數集合的升級
向整數集合添加元素的時候,如果新元素的型別比這個整數集合的編碼方式還長,那么整數集合就是先進行升級,然后再把新元素添加進去,
升級的操作包括:
- 從
INTSET_ENC_INT16升級到INTSET_ENC_INT32, - 從
INTSET_ENC_INT16升級到INTSET_ENC_INT64, - 從
INTSET_ENC_INT32升級到INTSET_ENC_INT64,
升級程序總共分為3步:
- 根據新元素的資料型別,增大元素陣列的記憶體空間,同時為新元素也分配好空間,
- 把現有的元素都轉換為新元素的資料型別,并按照從小到大的順序放到正確的位上,
- 把新元素放到元素陣列的最后一個位置上,
另外,整數集合是不支持降級操作的,即使元素被洗掉后,整數集合符合較短的編碼方式,也不會有降級操作,
總結
整數集合(intset)是Redis集合資料型別的內部編碼之一,可以保存int16_t、int32_t和int64_t型別的整數,
整數集合(intset)的結構中包含三個屬性:編碼方式(encoding)、元素數量(length)和元素陣列(contents),
新增的元素的型別比整數集合的編碼方式還長時,該整數集合會有升級操作,整數集合不支持降級操作,
最后,謝謝你這么帥,還給我點贊和關注,
微信公眾號:萬貓學社
微信掃描二維碼
關注后回復「電子書」
獲取12本Java必讀技術書籍
作者:萬貓學社
出處:http://www.cnblogs.com/heihaozi/
著作權宣告:本文遵循 CC 4.0 BY-NC-SA 著作權協議,轉載請附上原文出處鏈接和本宣告,
微信掃描二維碼,關注萬貓學社,回復「電子書」,免費獲取12本Java必讀技術書籍,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/444452.html
標籤:NoSQL
