redis数据是存储为sds还是对象?

Is redis data stored as sds or as objects?

我正在尝试了解 Redis 的内部结构。它使用字典的简单实现作为内存中的数据存储。此外,从客户端传输到服务器的数据由其自己的 RESP 协议序列化。

我至今没有搞清楚的是redis是如何存储数据的。它将相应的 RESP 值存储为 simple dynamic string (sds) 还是首先解析来自 RESP 的值,例如。作为一个整数并将其存储为一个 int (可能来自共享整数数组),这又是一个 sds 吗?我很好奇,因为在 dict.c 例如int dictAdd(dict *d, void *key, void *val){...}数据使用void *,这可能表明数据存储为string,int或其他任何东西,但追踪它我没有找到任何将sds转换为对象的代码。

但是如果将数据存储为sds,它如何存储列表和集合?

Redis中的每一种数据类型都有自己的编码方式,而且大部分都有几种编码方式来应对不同的场景。甚至 sds 字符串(是的,字符串键通常是 sds 字符串)也可以有多种编码。

集合、排序集合、列表和散列在它们很小的时候在内存中使用紧凑的 "ziplist" 编码,但是当它们增长时移动到内存浪费但更快的编码。

最复杂的对象是排序集,它是跳表和散列的组合 table。并且新的流对象也有一个非常有趣的表示。

虽然在 RDB 中,它们被序列化为紧凑的表示形式,而不是像它们在内存中那样保存。