vault backup: 2026-05-25 22:24:47
This commit is contained in:
@@ -223,15 +223,23 @@ flowchart TB
|
||||
> [!insight] 紧凑结构不是万能的
|
||||
> ziplist/listpack 的查找是 O(N)——要从头遍历到目标 entry。当元素少时,这块连续内存对 CPU cache 非常友好,遍历也很快。但元素一多,O(N) 的代价就压不住了,必须切到 hashtable(O(1))或 skiplist(O(logN))。
|
||||
|
||||
各类型的切换阈值:
|
||||
各类型的切换阈值——**阈值内**用紧凑编码省内存,**超过阈值**切到通用结构保性能:
|
||||
|
||||
| 数据类型 | 配置项 | 默认值 | 切换到 |
|
||||
|---------|--------|--------|-------|
|
||||
| Hash | `hash-max-ziplist-entries` | 512 | hashtable |
|
||||
| Hash | `hash-max-ziplist-value` | 64 字节 | hashtable |
|
||||
| ZSet | `zset-max-ziplist-entries` | 128 | skiplist+hashtable |
|
||||
| ZSet | `zset-max-ziplist-value` | 64 字节 | skiplist+hashtable |
|
||||
| List | `list-max-ziplist-size` | -2 (每个节点 8KB) | quicklist 新节点 |
|
||||
| 数据类型 | 阈值内编码 | 配置项 | 默认值 | 超过阈值切到 |
|
||||
|---------|-----------|--------|--------|------------|
|
||||
| Hash | listpack ¹ | `hash-max-ziplist-entries` | 512 个 field | **dict**(hashtable) |
|
||||
| Hash | listpack ¹ | `hash-max-ziplist-value` | 64 字节 | **dict**(hashtable) |
|
||||
| ZSet | listpack ¹ | `zset-max-ziplist-entries` | 128 个 member | **skiplist + dict** |
|
||||
| ZSet | listpack ¹ | `zset-max-ziplist-value` | 64 字节 | **skiplist + dict** |
|
||||
| List | quicklist 节点内的 listpack | `list-max-ziplist-size` ² | -2(每节点 8KB) | quicklist **新节点** |
|
||||
|
||||
¹ Redis 6 为 ziplist,7.0+ 为 listpack。配置参数名不变。
|
||||
² Redis 7.2+ 配置项更名为 `list-max-listpack-size`。
|
||||
|
||||
> [!question] 切换后各自长什么样?
|
||||
> - **Hash**:从一块连续内存(listpack)变成 **dict**——两张 hashtable 交替 rehash,查找从 O(N) → O(1)
|
||||
> - **ZSet**:从一块连续内存(listpack)变成 **skiplist + dict** 的双结构——skiplist 负责有序遍历和范围查询 O(logN),dict 负责按 member 查 score O(1)
|
||||
> - **List**:不是"丢弃 listpack",而是 quicklist 继续以 listpack 为节点内容,只是**单个节点的容量上限**受此阈值控制;超限时 quicklist 不会转换编码,而是把新元素放进一个**新的 listpack 节点**
|
||||
|
||||
## 关联笔记
|
||||
|
||||
|
||||
Reference in New Issue
Block a user