Redis中的String类型深入理解

🧵 Redis 字符串类型(String)的底层数据结构

Redis 的 字符串类型(String) 是最基础和常用的数据类型,但其底层实现并不局限于一种固定结构。根据字符串的长度和内容,Redis 会使用不同的数据结构来优化性能和内存利用率。

数据结构选择策略

Redis 根据字符串长度和内容自动选择最合适的底层数据结构:

数据结构存储条件优点
整数编码(int)字符串可以转换为整数(如 "123"节省内存,快速计算
Embstr 编码短字符串(≤ 44 字节)高效内存管理,减少分配次数
SDS长字符串或复杂二进制数据动态扩展,二进制安全

SDS(Simple Dynamic String)

🔹 核心结构:
SDS 是 Redis 字符串类型的主要底层实现。它是对 C 语言 char* 的增强,解决了传统 C 字符串的一些问题(如 '\0' 终止、长度获取复杂等)。

🔹 结构定义:

struct sdshdr {
    int len;        // 当前字符串长度
    int free;       // 剩余未使用空间
    char buf[];     // 字符数组,存储实际数据
};

🔹 特点:

  • 动态扩展:自动扩展或收缩,避免频繁内存分配。
  • 二进制安全:支持存储任意二进制数据(非 '\0' 终止)。
  • O(1) 长度获取len 字段存储字符串长度,无需遍历。

🔹 应用:

  • 存储 短字符串 和 普通文本 数据。

📦 2. 整数编码(int)

🔹 场景:
当字符串内容是 整数值(如 "123"),且长度较短时,Redis 会将其存储为 整数类型 而不是 SDS。

🔹 优化原因:

  • 节省内存:直接用整数存储,比用 SDS 表示更高效。
  • 加速操作:整数直接参与计算,无需转换。

🔹 示例:

SET key 100
GET key  # Redis 内部将 "100" 存储为整数

注意: 一旦字符串内容发生变化(如转换为非整数),Redis 会将其转换回 SDS。


📜 3. Embstr 编码(Embedded String)

🔹 场景:
用于存储 短字符串(通常小于 44 字节)。

🔹 特点:

  • 内存连续分配embstr 会将 SDS 头部和实际数据存储在一块连续内存中。
  • 减少内存分配次数:与常规 SDS 不同,embstr 在创建时只进行一次内存分配。

🔹 优势:

  • 提高短字符串操作的效率。
  • 降低内存碎片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值