详解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 是单线程执行命令的

相关推荐
Zzz 小生1 小时前
LangChain Tools:工具使用完全指南
jvm·数据库·oracle
SQL必知必会2 小时前
SQL 计算百分位数和中位数
数据库·sql
亓才孓2 小时前
[SpringBoot]UnableToConnectException : Public Key Retrieval is not allowed
java·数据库·spring boot
好学且牛逼的马2 小时前
从“混沌初开”到“有序统一”:Java集合框架发展历程与核心知识点详解
前端·数据库·python
REDcker4 小时前
HDR Vivid 技术介绍
数据库·算法·视频·sdr·屏幕·显示技术·dhr
冰暮流星4 小时前
sql语句之union语句
数据库·sql
2401_876381924 小时前
程序人生-Hello’s P2P
数据库·程序人生·p2p
VX:Fegn08954 小时前
计算机毕业设计|基于springboot + vue养老院管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
湘-枫叶情缘4 小时前
从数据库写作到情绪工程:网络文学工程化转向的理论综述
数据库·人工智能
heimeiyingwang5 小时前
企业非结构化数据的 AI 处理与价值挖掘
大数据·数据库·人工智能·机器学习·架构