当前位置: 首页 > news >正文

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

在这里插入图片描述

相关文章:

  • LeetCode题解1297. 子串的最大出现次数
  • 大模型评测调研报告
  • 计算机网络 | 应用层(6) -- 套接字编程
  • 大模型基础(三):Llama3复现
  • Mac桌面幻灯片,Google文档,google硬盘和google等图标如何移除
  • Docker(二):docker常用命令
  • 2025系统架构师---解释器架构风格‌
  • Rust:安全与性能兼得的现代系统编程语言
  • 深入探索Python Pandas:解锁数据分析的无限可能
  • 【Java】分布式事务解决方案
  • 「Mac畅玩AIGC与多模态02」部署篇01 - 在 Mac 上部署 Ollama + Open WebUI
  • (MySQL)表的操作
  • Ant(Ubuntu 18.04.6 LTS)安装笔记
  • 「Mac畅玩AIGC与多模态03」部署篇02 - 在 Mac 上部署 Dify
  • Pydantic:校验器(@validator)、模型嵌套、模型继承
  • 使用cesium设置第一视角
  • openharmony—4.1 softbus_tool 工具编译使用测试笔记(持续更新)
  • ubuntu 安装ollama后,如何让外网访问?
  • 基于QT(C++)实现(GUI)旅行查询与模拟系统
  • 展销编辑器在未来的发展前景​
  • “上海-日喀则”直飞航线正式通航,将于5月1日开启首航
  • 为何未来的福利国家必须绿色且公平
  • 国家发改委回应美加征关税:典型的单边主义霸凌做法
  • 哈马斯同意释放剩余所有以色列方面被扣押人员,以换取停火五年
  • 新城市志|中国消费第一城,迎来“补贴力度最大”购物节
  • 游戏论|迟来的忍者与武士:从《刺客信条:影》论多元话语的争议