redis设计与实现_数据结构与对象

redis基础数据机构

Redis 有 5 种基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。
除此之外的数据类型还有Module 和 Stream

基本数据类型;

1 string (字符串)

字符串 string 是 Redis 最简单的数据结构。redis使用C语言实现,但没有直接使用C语言传统的字符串表示(以空字符结尾的字符 数组,以下简称C字符串),而是自己构建了一种名为简单动字符串
(simple dynamic string,SDS)的抽象类型,并将SDS用作Redis的默认 字符串表示。
在Redis里面,C字符串只会作为字符串字面量(string literal)用在 一些无须对字符串值进行修改的地方,比如打印日志

1.1 sds结构体相比c语言字符串的好处

获取字符长度的复杂度不同,C语言字符串没有记录字符长度,获取字符串长度时必须遍历整个字符串,时间为O(n),而SDS结构体中len字段记录了字符长度,直接读取即可,时间为O(1)
杜绝缓冲区溢出,C语言字符串拼接时,处理不当可能会因为分配的内存不够而造成缓冲区溢出,而SDS会根据长度来判断空间是否足够,空间不足时进行空间扩展,所以不会出现缓冲区溢出(注:redis单个key的值不能超过512M)
非文本内容存储,C语言字符串的字节数组是以\0结尾,而在处理图片或其他非文本数据时,可能会读取到该字符而进行提前结束,从而导致识别失败,而Redis记录了字符长度,所以不会出现提前结束而失败的情况
空间预分配,由于C语言字符串不记录自身长度,所以每个字符串的底层都是N+1个字符长的数组(包含末尾的结束符\0),而每次操作(增长或缩短)字符串时,就需要对这个字符串的数组进行内存重新分配,而Redis通过空间预分配策略,可以减少增长字符串时对SDS字符串内存的重分配次数
惰性空间释放,当SDS的字符串缩短时,程序并不立即使用重新分配来回收空出来的字节,而是内存大小及使用字符长度记录下来,等待下次使用

list (列表)

简单动态字符串