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-lruallkeys-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 特性,可显著降低内存占用并提升性能。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值