MST
星途 面试题库

面试题:Redis压缩列表中节点的结构是怎样的?

请详细阐述Redis压缩列表中节点的各个组成部分及其作用,比如前一个节点长度、编码方式等在实际存储和操作中的意义。
18.8万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

压缩列表(ziplist)节点组成部分及其作用

  1. 前一个节点长度(prevlen)
    • 作用:用于计算前一个节点在压缩列表中的偏移量。在遍历压缩列表时,通过这个字段可以快速定位到前一个节点的起始位置,从而实现双向遍历。例如,在删除某个节点时,需要通过prevlen找到前一个节点,以便调整后续节点的prevlen字段。
    • 存储方式:如果前一个节点的长度小于254字节,prevlen占用1个字节来存储长度值;如果前一个节点长度大于等于254字节,prevlen占用5个字节,第一个字节固定为254,后4个字节用于存储实际的长度值。
  2. 编码方式(encoding)
    • 作用:决定当前节点所存储的数据类型和长度信息。Redis通过编码方式来灵活存储不同类型的数据,以节省内存空间。例如,对于小整数,可以使用紧凑的编码方式存储,而对于字符串,则根据其长度采用不同的编码。
    • 存储方式:编码字段由1 - 2个字节组成,它包含两部分信息:数据类型(整数、字符串等)和数据长度。如果编码的第一个字节最高位为00,则表示存储的是小于12位的整数;如果最高位为110,则表示存储的是长度小于254字节的字符串;如果最高位为111,则表示存储的是长度大于等于254字节的字符串,此时需要额外字节来表示字符串长度。
  3. 数据内容(data)
    • 作用:实际存储的数据部分,根据编码方式的不同,数据内容的格式和含义也不同。例如,如果编码为整数类型,这里就直接存储对应的整数值;如果是字符串类型,这里存储的就是实际的字符串内容。
  4. 结束标记(zlend)
    • 作用:是一个特殊的节点,用于标记压缩列表的结束。它不包含prevlenencoding字段,只包含一个固定值0xFF(255)。在遍历压缩列表时,当遇到这个值,就知道已经到达压缩列表的末尾。