详解redis(6):数据结构String

张开发
2026/5/22 15:35:12 15 分钟阅读
详解redis(6):数据结构String
一、Redis 的“字符串对象”是什么Redis 中的字符串不是 C 的char*而是一个对象redisObject结构大致是typedef struct redisObject { unsigned type:4; // 对象类型string / list / hash ... unsigned encoding:4; // 编码方式int / embstr / raw void *ptr; // 指向实际数据 ... } robj;intembstrraw不是三种数据类型而是同一种 string 类型的三种“内部编码方式”。二、int 编码当字符串“长得像整数”触发条件当一个字符串内容是整数并且这个整数可以用 C 的long表示内部存储方式redisObject┌─────────────┐│ typestring ││ encodingint││ ptr100 │ ← 直接存整数不是指针└─────────────┘ptr不指向内存而是直接存整数值void强转 long*没有 SDS没有字符串拷贝三、embstr 编码优化短字符串embstr 的核心思想重点redisObject SDS 一次性分配在一块连续内存中一整块内存┌───────────────────────────────────┐│ redisObject │ SDS header │ buf[] │└───────────────────────────────────┘一次malloc一次freeptr指向 SDS为什么 embstr 比 raw 快对比项embstrrawmalloc 次数1 次2 次free 次数1 次2 次内存连续是否CPU cache 命中高较低短字符串非常多key、状态值、flag所以 embstr 是高频优化。四、raw 编码通用字符串方案raw 的内存结构两块内存┌─────────────┐ ┌─────────────────────┐│ redisObject │ ───► │ SDS header buf[] │└─────────────┘ └─────────────────────┘redisObject一块SDS一块两次mallocraw 的优势字符串可变支持APPEND/SETRANGE支持 SDS 扩容策略五、String 缓存对象方式一直接缓存整个 JSONSET user:1 {name:xiaolin,age:18}适合场景整体读、整体写用户详情页、商品详情页不频繁修改单个字段Redis完全不关心 JSON 结构只把它当字符串存。优点结构清晰只需要一次 GET网络开销小缺点修改一个字段 →必须整体反序列化 序列化不适合高频局部更新方式二Key 拆分字段级缓存适合场景经常只改部分字段单个字段被频繁访问如 age、status优点修改局部字段非常方便不需要 JSON 解析缺点key 数量膨胀需要 MGET 拼装对象维护成本高方式三String 做计数器为什么 String 特别适合计数根本原因Redis 是单线程执行命令的

更多文章