redis底层数据结构初解析
一,redis数据结构
1,redis五大对象
redis提供给用户直接访问的对象有五个:字符串对象,列表对象,哈希对象,集合对象,有序集合对象。
2,redis有较高性能的原因
除了直接使用内存的原因以外,基本对象使用多种底层数据结构,且灵活变化是redis高性能的另一个原因
3,底层数据结构
整数值,embstr编码的SDS(简单动态字符串对象),row编码的SDS,压缩列表,双端链表,跳跃表和字典
二,底层数据结构与对象之间的对应关系
1,字符串对象(整数值,SDS)
字符串对象是使用三种数据结构之一(另一个是有序集合)。
当字符串对象是由整数构成时,采用整数值作为底层结构;当对象有字符串构成,且值小于32字节,此时用embstr编码的SDS,否则采用row编码的SDS。
embstr编码比row的好处是:
只调用一次内存分配,速度较快,也只调用一次内存回收,因此效率较高
但redis不集成对embstr的操作,因此执行命令时,会自动将embstr转换为row编码。
2,列表对象(压缩列表,双端链表)
当列表对象所有值小于64字节,且长度小于512个,采用压缩列表作为底层结构。
否则自动采用双端链表的结构
3,哈希对象(压缩列表,字典)
当哈希对象每个值小于64字节,且大小小于512个时,采用压缩列表作为底层结构。
否则自动采用字典的结构
4,集合对象(整数,字典)
当集合对象每个值时整数,且集合大小小于512个时,采用整数作为底层结构。
否则自动采用字典的结构
5,有序集合(压缩列表,跳跃表和字典)
当集合的长度小于64字节,且集合大小小于128时,采用压缩列表作为底层结构。
否则自动采用跳跃表和字典的结构
有序集合是比较特殊的结构,采用跳跃表和字典双重结构:
当单独采用跳跃表时,虽然保留跳跃表的优点,但是获取集合的值时,无法像字典那样效率达到O(1)
当单独采用字典结构时,虽然获取值时效率较高,但由于字典时无序的,进行有序遍历或者排序时,效率较差。
三,应用广泛的压缩列表,字符串对象
压缩列表应用于列表对象、哈希对象、有序集合对象三种不同结构,是除了字符串对象应用较多的结构。
字符串对象是唯一一个嵌套于所有对象的数据结构。
列表,哈希,集合,有序集合都嵌套使用了字符串对象。