首页/数据/Redis 进阶速查/String 与 SDS 结构:编码差异与内存
数据结构与选型42 条

String 与 SDS 结构:编码差异与内存

String 用 SDS(简单动态字符串)存储,短字符串走 embstr 一次分配,超过 44 字节转 raw 两次分配;整数值直接用 int 编码省内存。

Redis 进阶速查数据更新于 2026-10-12
编码int / embstr / raw 三种
阈值44 字节:embstr 转 raw
注意APPEND、SETRANGE 会把短字符串改写为 raw

示例:观察编码

示例:观察编码
redis-cli SET n 100
redis-cli OBJECT ENCODING n        # int
redis-cli SET s hello
redis-cli OBJECT ENCODING s        # embstr
redis-cli APPEND s world
redis-cli OBJECT ENCODING s        # raw
int 编码同样存于字符串对象中,INCR/DECR 直接对整数编码做运算,没有解析开销;带前导零的 007 不会被当作整数。

易错点

  • 用 String 保存长 JSON 时按内容大小加对象开销占用内存,大批量小对象建议评估 Hash 或分片方案
  • APPEND/SETRANGE 之后原 embstr 会变为 raw,频繁原地修改短字符串会更快触发内存重分配

数据来源与参考

  • Redis 官方文档:Redis Strings 数据类型
  • Redis 源码 sds.c(简单动态字符串实现)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌