redis底层数据结构初解析

时间:2022-10-03 16:19:04

一,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)

    当单独采用字典结构时,虽然获取值时效率较高,但由于字典时无序的,进行有序遍历或者排序时,效率较差。

三,应用广泛的压缩列表,字符串对象

  压缩列表应用于列表对象、哈希对象、有序集合对象三种不同结构,是除了字符串对象应用较多的结构。

  字符串对象是唯一一个嵌套于所有对象的数据结构。

  列表,哈希,集合,有序集合都嵌套使用了字符串对象。