RedisJSON 内存占用剖析与调优

一、基础内存模型

  1. 指针包装

    • 所有 JSON 值(标量、对象、数组、字符串等)至少占用 8 字节,用于存储一个带类型标记的指针。
  2. 标量与空容器

    • null、true、false、小整数(静态缓存)、空字符串、空数组、空对象 均不分配额外内存,仅用上述 8 字节指针指向静态实例。

二、字符串存储

  • 额外字节消耗 = 字符串长度

  • 示例:存储 "bar"(3 字节)

    复制代码
    JSON.SET foo . '"bar"'  
    JSON.DEBUG MEMORY foo → 11 字节(8 + 3)  

三、数组的几何增长

  • 初始容量:4

  • 元数据:16 字节(8 字节容量,8 字节当前长度)

  • 指针包装:8 字节

  • 元素指针数组 :capacity × 8 字节

  • 示例:

    • 1--4 个元素 → 8 + 16 + 4×8 = 56 字节
    • 第 5 个元素触发扩容至 8 → 8 + 16 + 8×8 = 88 字节

四、磁盘文件存储对比

测试文件 原始 JSON 大小 RedisJSON 占用 MessagePack 占用
pass-100.json (380 B) 381 B 1,069 B 140 B
pass-jsonsl-1.json (1.4 KB) 1,387 B 2,190 B 757 B
pass-json-parser-0000.json (3.7 KB) 3,718 B 5,469 B 2,393 B
pass-jsonsl-yahoo2.json (22 KB) 22,466 B 26,901 B 16,869 B
pass-jsonsl-yelp.json (46 KB) 46,333 B 57,513 B 35,529 B

提示:删除数组或对象中的元素并不会自动释放已分配的内存。

五、全局字符串重用机制

  • Redis 内核对相同字符串内容只存一份物理内存,多处引用。
  • JSON.DEBUG MEMORY 报告时仍按逻辑实例"各自"计算,可能显著高于实际物理占用。

六、调优建议

  1. 小字符串优先:尽量避免超长文本字段,或分割存储;
  2. 合理预分配数组 :对大数组可预先 JSON.SET 一个空数组并扩容到合适长度,减少中间扩容次数;
  3. 字段重用:对重复出现的关键字或枚举值,依赖 Redis 全局字符串重用降低物理占用;
  4. 监控内存 :定期使用 JSON.DEBUG MEMORY 与 MEMORY USAGE 对比物理报告,识别潜在内存膨胀;
  5. 版本升级:关注新版 RedisJSON 的优化与内存改进,及时升级。

通过以上剖析与对比,您可以更精准地评估和控制 RedisJSON 在生产环境中的内存消耗,并制定高效的存储与访问策略。

相关推荐
Ivanqhz30 分钟前
正余弦位置编码(Sinusoidal Positional Encoding)
java·linux·数据库
Ivanqhz42 分钟前
层归一化、残差、前馈网络与激活函数简述
服务器·数据库·人工智能·深度学习·算法
Java后端的Ai之路1 小时前
Python进阶探索23 - Python中的Time与Datetime模块
开发语言·数据库·python·datetime·time
通信瓦工2 小时前
利用浊度和电导率测量确定乙二醇基流体的质量
网络·数据库·ai
小马同学-3 小时前
mysql数据库原理
数据库·mysql
东方护航数据恢复(深圳)3 小时前
政务信创案例:达梦 DM8 数据库掉电页损坏,48 小时修复实录【东方护航数据恢复深圳店】
数据库·数据恢复·it运维·服务器数据恢复·二次开盘·硬盘开盘
AC赳赳老秦4 小时前
OpenClaw 数据引用规范自动生成:为公开数据构建可信来源标注与标准引用体系
大数据·开发语言·汇编·数据库·人工智能·deepseek·openclaw
小蒜学长5 小时前
校园社团招新网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·校园社团招新网站
布莱克6056 小时前
MySQL 增删改查(CRUD)语法详解
数据库·mysql·增删改查
Dovis(誓平步青云)6 小时前
几个方案来回选不定?做一个随时切换的候选推荐页
android·java·服务器·开发语言·javascript·数据库·智能化