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

问题描述 投票:0回答:1

我正在努力了解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,它如何存储列表和集合?

database dictionary redis storage
1个回答
2
投票

Redis中的每种数据类型都有自己的编码,其中大多数都有针对不同场景的多种编码。甚至sds字符串(是的,字符串键通常是sds字符串)可以有多种编码。

集合,排序集,列表和散列在内存中使用紧凑的“ziplist”编码,当它们很小时,但在它们增长时转移到内存浪费但速度更快的编码。

最复杂的对象是有序集,它是skiplist和hash表的组合。而新的流对象也有一个非常有趣的表现形式。

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

© www.soinside.com 2019 - 2024. All rights reserved.