整数集合与压缩列表:Redis的极致内存优化

引言 你是否好奇:为什么同样存储100个整数,Redis的内存占用只有其他数据库的1/10?为什么小Hash比大Hash节省这么多内存?编码转换是如何发生的? 今天我们深入Redis的两大内存优化数据结构:整数集合(intset)和压缩列表(ziplist/listpack),揭秘Redis在小数据量场景下的极致优化。 一、为什么需要内存优化数据结构? 1.1 性能 vs 内存的权衡 通用数据结构的问题: 字典(hashtable): - 查询:O(1) ✅ - 内存:每个节点 ~50字节(dictEntry + 指针) ❌ 跳表(skiplist): - 查询:O(logN) ✅ - 内存:每个节点 ~80字节(多层指针) ❌ 问题:对于小数据量(如10个元素的Set),使用通用结构浪费内存 Redis的解决方案: 针对小数据量场景,设计紧凑的专用数据结构,牺牲一点性能换取内存节省。 1.2 编码策略 Redis采用双重编码策略: 数据类型 小数据量编码 大数据量编码 转换阈值 Set intset(所有元素都是整数) hashtable 512个元素 Hash ziplist/listpack hashtable 512个字段 或 64字节值 ZSet ziplist/listpack skiplist + hashtable 128个元素 或 64字节值 List quicklist(内部使用ziplist/listpack) quicklist - 核心思想: 小数据量:节省内存优先(连续内存,紧凑编码) 大数据量:性能优先(O(1)查询) 二、整数集合(intset) 2.1 核心结构 typedef struct intset { uint32_t encoding; // 编码方式(int16/int32/int64) uint32_t length; // 元素数量 int8_t contents[]; // 柔性数组,实际存储整数 } intset; 编码类型: ...

2025-01-21 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...