MST

星途 面试题库

面试题:Redis对象系统中常见类型的编码方式及应用场景

请简述Redis中字符串、列表、哈希、集合、有序集合这几种常见数据类型各自有哪些编码方式,以及在什么样的场景下会采用不同的编码方式。
20.2万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

字符串(string)

  • 编码方式
    • int:如果字符串值是一个整数,并且这个整数可以用 long 类型来表示,Redis 会使用 int 编码,将这个整数直接存储,这样可以节省内存空间。
    • embstr:当字符串长度小于等于 44 字节(这个长度可能因 Redis 版本和编译选项略有不同)时,会采用 embstr 编码。embstr 编码会将 RedisObject 结构和实际的字符串内容连续存储在一块内存中,减少内存碎片,提高内存分配和释放的效率。
    • raw:当字符串长度大于 44 字节时,采用 raw 编码。此时 RedisObject 结构和字符串内容会分开存储,这样在字符串长度较大时更灵活地管理内存。
  • 场景
    • int:适合存储数值类型的字符串,如计数器,在这种场景下使用 int 编码不仅节省内存,还可以利用整数操作的高效性。
    • embstr:对于短字符串,如常用的配置项、小的标识等,使用 embstr 编码可以提高内存利用率和操作效率。
    • raw:长字符串,如较长的文本内容、JSON 字符串等,raw 编码能更好地适应大字符串的存储和管理。

列表(list)

  • 编码方式
    • ziplist:当列表中元素个数小于 list-max-ziplist-entries 配置项(默认 512),且每个元素的长度小于 list-max-ziplist-value 配置项(默认 64 字节)时,使用 ziplist 编码。ziplist 是一种紧凑的、连续存储的结构,它将多个元素存储在一块连续的内存中,能有效节省内存空间。
    • linkedlist:当列表不满足 ziplist 编码条件时,采用 linkedlist 编码。linkedlist 编码使用双向链表结构,每个节点存储一个元素,这样在元素个数较多或元素长度较大时,更便于插入和删除操作。
  • 场景
    • ziplist:适用于小型列表,比如存储有限数量的最近登录用户记录等,ziplist 编码能在节省内存的同时保证一定的操作效率。
    • linkedlist:适合大型列表,特别是需要频繁进行插入和删除操作的场景,如消息队列,linkedlist 能提供高效的节点操作。

哈希(hash)

  • 编码方式
    • ziplist:当哈希对象的键值对个数小于 hash-max-ziplist-entries 配置项(默认 512),且每个键和值的长度都小于 hash-max-ziplist-value 配置项(默认 64 字节)时,采用 ziplist 编码。同样,ziplist 以紧凑的方式存储键值对,节省内存。
    • hashtable:当哈希对象不满足 ziplist 编码条件时,使用 hashtable 编码。hashtable 采用哈希表结构,通过哈希函数计算键的存储位置,能快速进行查找、插入和删除操作。
  • 场景
    • ziplist:适用于小型哈希表,如存储用户的基本信息(字段和值都较短),ziplist 编码能有效减少内存占用。
    • hashtable:对于大型哈希表,比如存储商品详细信息,字段和值可能较多且长度不一,hashtable 编码能提供高效的查找和修改性能。

集合(set)

  • 编码方式
    • intset:当集合中的所有元素都是整数,并且元素个数小于 set-max-intset-entries 配置项(默认 512)时,使用 intset 编码。intset 是一个有序的整数集合,采用紧凑数组存储,能高效存储整数类型的集合元素。
    • hashtable:当集合不满足 intset 编码条件时,采用 hashtable 编码。这里的 hashtable 以键值对的形式存储,键为集合元素,值为 NULL,利用哈希表的快速查找特性实现集合操作。
  • 场景
    • intset:适合存储整数类型的小型集合,如存储用户的年龄集合等,intset 编码节省内存且操作高效。
    • hashtable:适用于包含各种类型元素的集合,或者元素个数较多的整数集合,如存储网站的标签集合,hashtable 编码能快速进行集合的添加、删除和查找操作。

有序集合(sorted set)

  • 编码方式
    • ziplist:当有序集合的元素个数小于 zset-max-ziplist-entries 配置项(默认 128),且每个元素的成员和分值的长度都小于 zset-max-ziplist-value 配置项(默认 64 字节)时,使用 ziplist 编码。在 ziplist 中,元素按照分值从小到大存储,方便进行范围查询。
    • skiplist:当有序集合不满足 ziplist 编码条件时,采用 skiplist(跳跃表)和 hashtable 结合的编码方式。跳跃表用于按分值对元素进行排序,支持高效的范围查询;hashtable 用于通过成员快速定位元素,以提高查找效率。
  • 场景
    • ziplist:适用于小型有序集合,如存储少数热门文章的排行榜(文章标题和热度值都较短),ziplist 编码能在节省内存的同时实现简单的排序和查询。
    • skiplist:适合大型有序集合,比如存储游戏玩家的积分排行榜等,skiplist 和 hashtable 的结合能高效地处理大量元素的排序、查找和范围查询操作。