Redis ssd是什么?Redis 内存空间优化的点都有哪些?embstr 和 row、intset、ziplist分别是什么?
Redis SSD 是什么?
Redis SSD 通常指 Redis 使用 SSD(固态硬盘)作为持久化存储介质的场景。虽然 Redis 是内存数据库(数据主要驻留内存),但其持久化机制(如 RDB 快照和 AOF 日志)需要将数据写入磁盘。使用 SSD 可以显著提升持久化文件的读写速度,尤其在以下场景:
- 快速恢复:重启时从 RDB/AOF 恢复数据到内存的速度更快。
- 高吞吐写入:处理大量 AOF 日志写入时,SSD 的 IOPS 能力优于 HDD。
- 混合存储方案:某些扩展方案(如 Redis on Flash)将冷数据存于 SSD,热数据存于内存,但需第三方支持。
Redis 内存优化关键点
1. 选择高效的数据结构
- 避免大 Key:单个 Key 的 Value 过大会增加内存和网络开销。
- 使用 Hash 替代多个 String:存储对象属性时,Hash 的
ziplist
编码比多个 String 更省内存。 - HyperLogLog:基数统计(如 UV)时,HyperLogLog 仅需 12KB,误差率 <1%。
- Bitmap:布尔值场景(如用户签到),Bitmap 极度压缩存储。
2. 利用编码优化
Redis 根据数据特征动态选择编码方式,通过配置参数优化:
- ziplist:列表、哈希、有序集合在元素较少时使用压缩列表。
- intset:整数集合用于全为整数的集合。
- quicklist:列表的底层结构(结合 ziplist 和链表)。
配置示例:
hash-max-ziplist-entries 512 # Hash 元素数 ≤512 时用 ziplist
hash-max-ziplist-value 64 # Hash 的每个字段值长度 ≤64 字节
set-max-intset-entries 512 # Set 元素数 ≤512 且全为整数时用 intset
3. 控制过期时间与淘汰策略
- 设置 TTL:自动清理过期数据,避免内存泄漏。
- 选择淘汰策略:如
volatile-lru
或allkeys-lfu
,根据业务特点配置。
4. 内存碎片管理
- 启用 Jemalloc:Redis 默认的内存分配器,减少碎片。
- 监控碎片率:通过
INFO memory
查看mem_fragmentation_ratio
,过高时重启或使用MEMORY PURGE
(需支持)。
5. 共享对象池
- 小整数复用:Redis 默认缓存 0~9999 的整数,直接复用对象。
embstr、raw、intset、ziplist 详解
1. embstr 与 raw
-
embstr(embedded string)
- 适用场景:字符串长度 ≤44 字节(Redis 5.0+)。
- 内存布局:RedisObject 和 SDS(简单动态字符串)在连续内存中分配,减少内存碎片和指针开销。
- 优点:一次内存分配,CPU 缓存友好。
-
raw
- 适用场景:字符串长度 >44 字节。
- 内存布局:RedisObject 和 SDS 分两次分配,内存不连续。
示例:
SET key1 "short" # embstr 编码(长度 5)
SET key2 "a_very_long_string_..." # raw 编码(长度 >44)
2. intset(整数集合)
- 适用场景:Set 集合元素全为整数且元素数 ≤
set-max-intset-entries
(默认 512)。 - 结构:连续内存存储有序整数数组,支持 int16/int32/int64 动态升级。
- 优点:无哈希表开销,内存紧凑。
示例:
SADD numbers 1 2 3 # intset 编码
SADD numbers "hello" # 编码变为 hashtable
3. ziplist(压缩列表)
- 适用场景:List、Hash、ZSet 在元素较少且值较小时使用。
- 结构:连续内存块,通过长度字段和特殊编码压缩数据,无指针开销。
- 优点:内存高效,但修改操作时间复杂度高(需重新分配内存)。
配置参数:
list-max-ziplist-size -2 # Quicklist 中每个 ziplist 节点大小
zset-max-ziplist-entries 128 # ZSet 元素数 ≤128 时用 ziplist
zset-max-ziplist-value 64 # ZSet 元素值长度 ≤64 字节
溢出页管理与数据存储格式
行溢出(Row Overflow)
- 问题:当 Redis 的 Key 或 Value 过大时,内存碎片可能增加,但 Redis 无传统数据库的行溢出机制(因数据全在内存)。
- 优化:通过分片(如 Hash 分桶)或压缩大 Value(如 gzip)。
数据存储格式
- RedisObject:所有 Redis 数据统一封装为
redisObject
,包含类型(string/hash 等)、编码(embstr/ziplist 等)和指针。 - SDS(简单动态字符串):动态扩展的字符串结构,支持二进制安全与高效追加操作。
总结
技术点 | 核心作用 | 优化场景 |
---|---|---|
SSD 持久化 | 加速 RDB/AOF 的读写 | 快速恢复、高吞吐写入 |
embstr | 短字符串内存优化 | 存储小文本(如 Session ID) |
intset | 整数集合内存压缩 | 存储 IP 黑白名单 |
ziplist | 小规模列表/哈希/有序集合的压缩存储 | 存储对象属性、小型排行榜 |
内存碎片管理 | 减少无效内存占用 | 长期运行的高频写入场景 |
通过合理选择数据结构、调整编码参数及利用 Redis 特性,可显著降低内存占用并提升性能。