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 中,它们被序列化为紧凑的表示形式,而不是像它们在内存中那样保存。
我正在尝试了解 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 中,它们被序列化为紧凑的表示形式,而不是像它们在内存中那样保存。