[Redis]Intset

Duancf發表於2024-08-30

intset 小整數集合

set 集合容納的元素都是整數並且元素個數較少時, Redis 會使用 intset 來儲存集合元素。
intset 是緊湊的陣列結構,同時支援 16 位、 32 位和 64 位整數

struct intset<T>
{
	int32 encoding;//決定整數位寬是 16 位、 32 位還是 64
	int32 length ;//元素個數
	int<T> contents;//整數陣列,可以是 16 位、 32 位和 64
}

5-8 所示是 intset 的內部結構示意圖。老錢也不理解為什麼 intset encoding欄位和 length 欄位使用 32 位整數儲存,畢竟它們只是用來儲存小整數的,長度不應該很長,而且 encoding 只有 16 位、 32 位和 64 位三個型別,用一個位元組儲存就綽綽有餘。關於這點,讀者們可以進一步討論。

image

> sadd codehole 1 2 3
(integer) 3
> debug object codehole
Value at : Ox7fec2dc2bde0 refcount:l encoding:intset serializedlength:15 lru:6065795 lru_seconds_idle:4
> sadd codehole go java python
(integer) 3
> debug object codehole
Value at:Ox7fec2dc2bde0 refcount:1 encoding:hashtable serializedlength:22 lru:6065810 lru_seconds_idle:5

注意觀察 debug object 的輸出欄位 encoding 的值,可以發現當 set 裡面放進去了非整數值時,儲存形式立即從 intset 轉變成了 hash 結構。

相關文章