Redis 中每種常用數據類型都對應多種內部編碼,這些編碼會根據數據特征(如大小、數量)自動切換,以平衡存儲效率和操作性能。
1.字符串(String)
用途:存儲文本、數字或二進制數據,是最基礎的類型。
內部編碼:
int
- 適用場景:存儲 64 位整數(如?
123
、-456
)。- 特點:直接以整數形式存儲,節省內存,支持快速自增 / 自減(
INCR
/DECR
)。embstr
- 適用場景:存儲短字符串(Redis 3.2+ 中長度 ≤ 44 字節)。
- 特點:字符串內容與元數據(如長度)存儲在連續內存塊,減少內存碎片,創建和刪除更高效。
raw
- 適用場景:存儲長字符串(長度 > 44 字節)或非整數數據。
- 特點:基于動態字符串(SDS)結構實現,支持高效的字符串拼接(
APPEND
)和修改。
2.哈希(Hash)
用途:存儲結構化數據(如用戶信息、商品屬性),以 “字段 - 值” 對形式組織。
內部編碼:
ziplist(壓縮列表)
- 適用場景:字段數量少(默認 ≤ 512)且字段 / 值均為短字符串(默認 ≤ 64 字節)。
- 特點:所有字段和值按順序緊湊存儲在連續內存,內存利用率極高,但不適合頻繁修改大量字段。
hashtable(哈希表)
- 適用場景:字段數量多或字段 / 值較長(超過?
ziplist
?限制)。- 特點:采用數組 + 鏈表結構,支持 O (1) 時間復雜度的增刪改查,適合頻繁操作。
切換規則:當字段數 >?
hash-max-ziplist-entries
(默認 512)或任一字段 / 值長度 >?hash-max-ziplist-value
(默認 64 字節)時,自動從?ziplist
?轉為?hashtable
。
3. 列表(List)
- 功能:有序、可重復的元素集合,支持兩端插入 / 刪除操作。
- 內部編碼:
ziplist
(壓縮列表):當列表元素少且元素為短字符串或小整數時使用(默認元素數 ≤512,單個元素 ≤64 字節),連續內存存儲,節省空間。linkedlist
(雙向鏈表):當列表元素過多或元素過大時使用,適合頻繁修改操作。- 注意:Redis 3.2+ 引入?
quicklist
?作為默認編碼,結合了?ziplist
?和?linkedlist
?的優點,將列表分割為多個?ziplist
?片段,用鏈表連接。
4.集合(Set)
- 功能:無序、不可重復的元素集合,支持交集、并集等操作。
- 內部編碼:
intset
(整數集合):當集合元素全為整數且數量少(默認 ≤512)時使用,連續內存存儲,比哈希表更節省空間。hashtable
(哈希表):當集合包含非整數元素或元素數量過多時使用,通過哈希表實現去重。
5.zset
? ? ? ? ? ? ?Redis 中的 ZSET(Sorted Set,有序集合)是一種特殊的數據結構,它結合了集合(Set)和有序性的特性。與普通集合(Set)一樣,ZSET 中的元素是唯一的,不會重復,但每個元素都會關聯一個浮點數分數(score),Redis 正是通過這個分數來為集合中的元素進行排序。
內部編碼(存儲結構)
ZSet 會根據元素數量和大小自動選擇以下編碼:
ziplist(壓縮列表)
- 適用場景:元素數量少(默認 ≤128 個)且元素 / 分數都是短值(默認 ≤64 字節)
- 存儲方式:元素和分數成對緊湊存儲在連續內存中,按分數排序
- 優點:內存占用極低,適合小型 ZSet
skiplist + hashtable(跳躍表 + 哈希表)
- 適用場景:元素數量多或元素 / 分數較大時
- 存儲方式:
- 跳躍表:按分數排序存儲元素,支持快速范圍查詢和排名計算
- 哈希表:映射元素到分數,支持 O (1) 復雜度的分數查詢
- 優點:操作效率高,適合大型 ZSet