详解redis(6):数据结构string、list

一、Redis 的"字符串对象"是什么?

Redis 中的字符串不是 C 的 char*,而是一个 对象(redisObject),结构大致是:

cpp 复制代码
typedef struct redisObject {
    unsigned type:4;      // 对象类型(string / list / hash ...)
    unsigned encoding:4;  // 编码方式(int / embstr / raw)
    void *ptr;            // 指向实际数据
    ...
} robj;

所以你看到的:

int

embstr

raw

不是三种数据类型,而是同一种 string 类型的三种"内部编码方式"

二、int 编码:当字符串"长得像整数"

触发条件

当一个字符串:

内容是 整数

并且这个整数 可以用 C 的 long 表示

内部存储方式

redisObject

┌─────────────┐

│ type=string │

│ encoding=int│

│ ptr=100 │ ← 直接存整数,不是指针

└─────────────┘

ptr 不指向内存

而是 *直接存整数值(void 强转 long)**

没有 SDS

没有字符串拷贝

三、embstr 编码:优化"短字符串"

embstr 的核心思想(重点)

redisObject + SDS 一次性分配在一块连续内存中

一整块内存
┌───────────────────────────────────┐
│ redisObject │ SDS header │ buf\[\] │
└───────────────────────────────────┘

一次 malloc

一次 free``ptr

指向 SDS

为什么 embstr 比 raw 快?

对比项 embstr raw
malloc 次数 1 次 2 次
free 次数 1 次 2 次
内存连续
CPU cache 命中 较低

短字符串非常多(key、状态值、flag),所以 embstr 是高频优化。

四、raw 编码:通用字符串方案

raw 的内存结构

两块内存

┌─────────────┐ ┌─────────────────────┐

│ redisObject │ ───► │ SDS header + buf\[\] │

└─────────────┘ └─────────────────────┘

redisObject 一块

SDS 一块

两次 malloc

raw 的优势

字符串可变

支持 APPEND / SETRANGE

支持 SDS 扩容策略

五、String 缓存对象

方式一:直接缓存整个 JSON

SET user:1 '{"name":"xiaolin","age":18}'

适合场景

整体读、整体写

用户详情页、商品详情页

不频繁修改单个字段

Redis 完全不关心 JSON 结构,只把它当字符串存。

优点

结构清晰

只需要一次 GET

网络开销小

缺点

修改一个字段 → 必须整体反序列化 + 序列化

不适合高频局部更新

方式二:Key 拆分(字段级缓存)

适合场景

经常只改 部分字段

单个字段被频繁访问(如 age、status)

优点

修改局部字段非常方便

不需要 JSON 解析

缺点

key 数量膨胀

需要 MGET 拼装对象

维护成本高

方式三:String 做计数器

为什么 String 特别适合计数?

根本原因

Redis 是单线程执行命令的

相关推荐
cui_ruicheng1 小时前
MySQL(四):数据类型与字段设计
数据库·mysql
皮皮学姐分享-ppx2 小时前
政府绿色采购数据库(2015-2024.3)
大数据·网络·数据库·人工智能·制造
闪电悠米4 小时前
黑马点评-Redis 消息队列-03_stream_consumer_group
开发语言·数据库·redis·分布式·缓存·junit·lua
DIY源码阁5 小时前
JavaSwing航班订票管理系统 - MySQL版
数据库·mysql
qqxhb5 小时前
47|成本与性能:缓存、批处理、模型路由与降级
缓存·批处理·智能模型路由·多级降级预案·成本预算
浪客灿心6 小时前
项目篇:模块设计与实现
数据库·c++
佛祖让我来巡山7 小时前
线上 Redis 突然“爆”了,怎么办?
redis·redis宕机·redis崩了·redis线上事故
流星白龙7 小时前
【MySQL高阶】26.事务(1)
数据库·mysql
三十..8 小时前
Redis 核心原理与高可用架构实践
运维·数据库·redis
这个DBA有点耶8 小时前
索引优化深潜(下):索引合并、ICP 与索引设计的实战法则
数据库·mysql·架构