Redis 是基于 C 语言编写的,所以常用的数据结构基本都需要自己实现。
对于字符串 Redis 实现了类似 std::string
的功能,具体是自动增长和 O(1) 时间复杂度的长度查询。使用额外的变量记录字符串的长度,而不是通过终止符 '\0'
来判断字符串结束。这样的好处这个字符串是 Binary-safe 的,可以使用字符串储存二进制数据。
对于哈希表 Redis 提供了 rehash 的操作,能在哈希表负载因子过高的时候进行哈希表的扩容。而扩容过程是逐步进行的,当一个 kv 对被 CRUD 的时候,会被 rehash 到新表。特别地,创建新 kv 对的时候,只会写入新表;读取的时候,先在旧表读,如果找不到,再在新表读。
对于整数集合,Redis 使用一个有序数组实现。为了节约空间,Redis 会判断储存这个集合需要的整数类型,例如是 int32_t
或者是 int16_t
。在插入新元素的时候,有可能需要升级类型,因为这个新元素的绝对值肯定比集合里面的元素都要大,所以只可能放在数组头或者数组尾,换言之升级类型时是可以一个一个数顺序转换并放到对应位置的,不需要开辟额外的空间完成这个操作。
TBC