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 和链表)。

配置示例

conf 复制代码
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 分两次分配,内存不连续。

示例

bash 复制代码
SET key1 "short"      # embstr 编码(长度 5)
SET key2 "a_very_long_string_..."  # raw 编码(长度 >44)
2. intset(整数集合)
  • 适用场景 :Set 集合元素全为整数且元素数 ≤ set-max-intset-entries(默认 512)。
  • 结构:连续内存存储有序整数数组,支持 int16/int32/int64 动态升级。
  • 优点:无哈希表开销,内存紧凑。

示例

bash 复制代码
SADD numbers 1 2 3    # intset 编码
SADD numbers "hello"  # 编码变为 hashtable
3. ziplist(压缩列表)
  • 适用场景:List、Hash、ZSet 在元素较少且值较小时使用。
  • 结构:连续内存块,通过长度字段和特殊编码压缩数据,无指针开销。
  • 优点:内存高效,但修改操作时间复杂度高(需重新分配内存)。

配置参数

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

相关推荐
南玖yy22 分钟前
解锁 C++26 的未来:从语言标准演进到实战突破
开发语言·数据库·c++·人工智能·c++23·c++基础语法
geekmice25 分钟前
通过SpringBoot+H2数据库+Mybatis实现DAO单元测试
数据库·spring boot·mybatis
弃梓30 分钟前
串口的缓存发送以及缓存接收机制
嵌入式硬件·缓存·嵌入式
java1234_小锋35 分钟前
如何配置NGINX作为反向代理服务器来缓存后端服务的响应?
前端·nginx·缓存
老年DBA37 分钟前
解决 Oracle EXPDP 無法鎖定 NFS 相關錯誤: ORA-27086 & flock: No locks available
数据库·oracle
菜是一种态度42 分钟前
PostgreSQL数据库操作SQL
数据库·sql·postgresql
海绵波波1077 小时前
DeepSeek谈《凤凰项目 一个IT运维的传奇故事》
运维·服务器·数据库
邪恶马铃薯7 小时前
SQL常用数据清洗语句
数据库·sql
Sunlight_7779 小时前
第六章 QT基础:9、Qt中数据库的操作
数据库·qt·oracle
deephub9 小时前
加速LLM大模型推理,KV缓存技术详解与PyTorch实现
人工智能·pytorch·深度学习·缓存·大语言模型