面试题答案
一键面试字符串(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:适用于小型列表,比如存储有限数量的最近登录用户记录等,ziplist 编码能在节省内存的同时保证一定的操作效率。
- linkedlist:适合大型列表,特别是需要频繁进行插入和删除操作的场景,如消息队列,linkedlist 能提供高效的节点操作。
哈希(hash)
- 编码方式:
- ziplist:当哈希对象的键值对个数小于
hash-max-ziplist-entries
配置项(默认 512),且每个键和值的长度都小于hash-max-ziplist-value
配置项(默认 64 字节)时,采用 ziplist 编码。同样,ziplist 以紧凑的方式存储键值对,节省内存。 - hashtable:当哈希对象不满足 ziplist 编码条件时,使用 hashtable 编码。hashtable 采用哈希表结构,通过哈希函数计算键的存储位置,能快速进行查找、插入和删除操作。
- ziplist:当哈希对象的键值对个数小于
- 场景:
- ziplist:适用于小型哈希表,如存储用户的基本信息(字段和值都较短),ziplist 编码能有效减少内存占用。
- hashtable:对于大型哈希表,比如存储商品详细信息,字段和值可能较多且长度不一,hashtable 编码能提供高效的查找和修改性能。
集合(set)
- 编码方式:
- intset:当集合中的所有元素都是整数,并且元素个数小于
set-max-intset-entries
配置项(默认 512)时,使用 intset 编码。intset 是一个有序的整数集合,采用紧凑数组存储,能高效存储整数类型的集合元素。 - hashtable:当集合不满足 intset 编码条件时,采用 hashtable 编码。这里的 hashtable 以键值对的形式存储,键为集合元素,值为 NULL,利用哈希表的快速查找特性实现集合操作。
- intset:当集合中的所有元素都是整数,并且元素个数小于
- 场景:
- 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:适用于小型有序集合,如存储少数热门文章的排行榜(文章标题和热度值都较短),ziplist 编码能在节省内存的同时实现简单的排序和查询。
- skiplist:适合大型有序集合,比如存储游戏玩家的积分排行榜等,skiplist 和 hashtable 的结合能高效地处理大量元素的排序、查找和范围查询操作。