我正在努力了解Redis的内部结构。它使用字典的简单实现作为内存中的数据存储。此外,从客户端传输到服务器的数据由其自己的RESP协议序列化。
到目前为止我没想到的是数据如何存储在redis中。它是否将相应的RESP值存储为simple dynamic string(sds),或者它是否首先解析RESP中的值,例如。作为一个整数并将其存储为一个int(可能来自共享整数数组),然后又是一个sds?我在dict.c中感到很好奇,例如int dictAdd(dict *d, void *key, void *val){...}
数据用作void *,这可能表示数据存储为字符串,int或其他任何内容,但跟踪它我没有找到任何代码将sds转换为对象。
但如果它将数据存储为sds,它如何存储列表和集合?
答案 0 :(得分:2)
Redis中的每种数据类型都有自己的编码,并且大多数编码都针对不同的场景进行了多种编码。甚至sds字符串(是的,字符串键通常是sds字符串)可以有多种编码。
设置,排序集,列表和散列在内存中使用紧凑的“ziplist”编码,当它们很小时,但在它们增长时转移到内存浪费但速度更快的编码。
最复杂的对象是有序集,它是skiplist和hash表的组合。而新的流对象也有一个非常有趣的表现形式。
但是在RDB中,它们被序列化为一个紧凑的表示形式,而不是保存在内存中。