MST

星途 面试题库

面试题:Redis中对象类型与编码是如何动态调整的

请阐述在Redis中,常见对象类型(如字符串、哈希、列表等)在何种情况下会发生编码的动态调整,以字符串对象为例说明调整的过程和意义。
11.7万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

常见对象类型编码动态调整情况

  1. 字符串(string)
    • 当字符串对象保存的是整数值且这个整数值可以用 long 类型表示时,编码会使用 int
    • 当字符串对象保存的是长度小于等于39字节的字符串时,编码会使用 embstr
    • 当字符串长度超过39字节时,编码会转换为 raw
  2. 哈希(hash)
    • 当哈希对象保存的所有键值对的键和值的字符串长度都小于64字节,并且键值对数量小于512个时,编码使用 ziplist
    • 否则,编码会转换为 hashtable
  3. 列表(list)
    • 当列表对象保存的所有字符串元素的长度都小于64字节,并且列表元素数量小于512个时,编码使用 ziplist
    • 否则,编码会转换为 linkedlist(在Redis 3.2之后如果满足一定条件会使用 quicklist)。

字符串对象编码调整过程及意义

  1. 调整过程
    • 例如开始创建一个字符串对象保存内容为 "123",由于它是可以用 long 类型表示的整数值,此时编码为 int。如果后续给这个字符串对象赋值为 "hello",长度小于39字节,编码会从 int 转换为 embstr。若再赋值一个长度超过39字节的字符串,如 "a very very long string that exceeds 39 bytes",编码就会从 embstr 转换为 raw
  2. 意义
    • 内存优化:不同编码方式占用内存不同。例如 int 编码对于保存整数值非常高效,占用空间小。embstr 编码在保存短字符串时,将对象头和字符串内容连续存储,减少内存碎片,而 raw 编码适用于长字符串,能更好地管理较大的内存区域。
    • 性能提升:不同编码在操作效率上有差异。int 编码在进行数值计算等操作时非常高效,ziplist 编码的哈希和列表在小数据量时遍历等操作有一定优势,而 hashtablelinkedlist(或 quicklist)在大数据量时能提供更好的扩展性和性能。