【Redis / 缓存内核】对象模型与 SDS:redisObject · type · encoding

💡 原文中文,约6700字,阅读约需16分钟。
📝

内容提要

本文探讨了Redis中值对象的存储与编码机制,分析了redisObject的结构及其type与encoding的分工。Redis支持多种字符串编码(如RAW、EMBSTR、INT),并通过SDS(简单动态字符串)实现高效内存管理。使用OBJECT ENCODING命令可以检查值对象的编码,强调了键名与值的不同存储方式。文章澄清了常见误解,指出Redis字符串的长度由SDS管理,而非以\0结尾。

🎯

关键要点

  • Redis 中的值对象通过 redisObject 结构表示,包含 type 和 encoding 字段,分别定义逻辑类型和物理存储方式。

  • Redis 支持多种字符串编码,包括 RAW、EMBSTR 和 INT,使用 SDS 实现高效的内存管理。

  • 使用 OBJECT ENCODING 命令可以检查值对象的编码,强调键名和值的存储方式不同。

  • SDS 设计目标是 O(1) 取长度、二进制安全,支持多种头部类型以适应不同长度的字符串。

  • 常见误解包括认为 Redis 字符串以 结尾、type 变更才会换存储、OBJECT ENCODING 只看键名等。

  • 值在内存中是 redisObject,字符串优先使用 EMBSTR、整型 INT、共享整数池,否则使用 RAW SDS。

🔎

延伸解读

Redis对象模型的灵活性

Redis中的值对象通过redisObject结构实现灵活的存储方式。每个值的逻辑类型和物理存储方式是分开的,这意味着同一类型的值可以根据需要在不同的编码之间切换。这种设计使得Redis能够在处理不同大小和类型的数据时,优化内存使用和性能。

SDS的优势与误解

SDS(简单动态字符串)在Redis中提供了O(1)的长度获取和二进制安全性,避免了C字符串的限制。常见误解是认为Redis字符串以 ull结尾,实际上,SDS通过元数据管理长度,允许值中包含 ull字符。这种设计使得Redis在处理复杂数据时更加灵活和高效。

OBJECT ENCODING命令的使用

使用OBJECT ENCODING命令可以检查Redis中值对象的编码方式,这对于调试和优化内存使用非常重要。需要注意的是,该命令只查看值的编码,而不涉及键名的存储方式。因此,在分析内存使用时,结合MEMORY USAGE命令可以获得更全面的视角。

延伸问答

Redis 中的 redisObject 结构包含哪些字段?

redisObject 结构包含 type、encoding、ptr、refcount 和 lru 字段。

Redis 支持哪些字符串编码方式?

Redis 支持 RAW、EMBSTR 和 INT 三种字符串编码方式。

如何检查 Redis 中值对象的编码?

可以使用 OBJECT ENCODING 命令来检查值对象的编码。

SDS 在 Redis 中的设计目标是什么?

SDS 的设计目标是 O(1) 取长度、二进制安全,并减少 realloc 的次数。

Redis 中字符串的长度是如何管理的?

Redis 字符串的长度由 SDS 的元数据管理,而不是以 结尾。

Redis 中的 EMBSTR 编码有什么限制?

EMBSTR 编码的阈值在源码中设定为 44 字节,超出后会转为 RAW 编码。

🏷️

标签

➡️

继续阅读