【Redis / 缓存内核】对象模型与 SDS:redisObject · type · encoding
内容提要
本文探讨了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 编码。