← 每日面试题 学习看板

对于redis的数据类型了解么简单说下

面试题/真实面试/2021/对于redis的数据类型了解么简单说下.md

对于redis的数据类型了解么简单说下

首次来源:vipkid 2021 一面

原题

对于redis的数据类型了解么?简单说下

完整讲解(权威版)

最后更新:2026-10-30 · 基于第 1 次作答

L1 · 30 秒速记

结论:Redis 的 5 种核心类型是 String/Hash/List/Set/Zset,面试要"表面用途 + 底层结构"两层答。 关键词:SDS · quicklist · skiplist · 整数数组 · ziplist 边界:衍生类型 Geo/Bitmap/HyperLogLog 是在 String 之上封装,不是独立底层结构。

L2 · 核心讲解

核心考点定位:Redis 类型题,面试官真正想听的是"这个类型为什么快 + 底层怎么存",而不是单纯背用途清单。

机制链(≥3 环):

  1. 表面分类 → 每种类型有独立 API,用途区分:String 最通用、Hash 存对象、List 队列、Set 去重、Zset 排行。
  2. 底层结构 → Redis 为省内存做了多编码优化:Hash/List/Set 小数据时用 ziplist/intset 紧凑结构,超阈值升级 hashtable/quicklist。
  3. 为什么快 → 内存存储 + O(1) 哈希 + 紧凑编码减少内存碎片,单线程避免锁竞争。

证据锚点:

对比与权衡:

类型底层(小→大)典型场景关键 API
StringSDS缓存、计数器、分布式锁SET/GET/INCR
Hashziplist → hashtable对象字段存储HGETALL/HSET
Listquicklist队列/栈、消息流LPUSH/RPOP/LRANGE
Setintset → hashtable去重、交集/并集SADD/SINTER
Zsetziplist → skiplist+dict排行榜、Top NZADD/ZRANGEBYSCORE

常见误区:

  1. 错误:只背 5 种类型名 → 正确:每种类型讲"用途 + 底层结构 + 典型命令" → 为什么:面试官要的是深度。
  2. 错误:把 Zset 说成"有序链表" → 正确:skiplist + 哈希表 → 为什么:跳表才是 O(log N) 关键。
  3. 错误:认为 Redis 单线程所以所有操作都 O(1) → 正确:ZRANGE 是 O(log N+M),大 key 会阻塞 → 为什么:单线程下任何慢命令都卡全局。

适用边界:如果追问"百万级排行榜",需进一步讲 skiplist 的 span 字段如何 O(log N) 定位排名,而非简单列举。

延伸追问(≥3)

  1. Zset 为什么用跳表而不是红黑树?
  1. Hash 什么时候从 ziplist 升级为 hashtable?
  1. List 的 quicklist 相比普通链表好在哪?

面试者参考回答(400–700 字)

【结论】 面试官您好,Redis 的核心是 5 种基本类型——String、Hash、List、Set、Zset,面试时我习惯"用途 + 底层结构"两层来讲。

【三点】 第一,String 是 SDS 实现,能存字符串和数字,支持 SETNX、INCR,常用于缓存、计数器、分布式锁;底层用简单动态字符串,比 C 字符串多了长度字段,求长是 O(1) 且二进制安全。第二,Hash 存对象字段,小数据用 ziplist 紧凑存储,字段多或值大了升级为哈希表;它比 String 序列化整个对象好在能按字段单独读写,适合缓存一个对象的多个属性。第三,List 是 quicklist——双向链表串起多个 ziplist 节点,两端 push/pop 是 O(1),能当队列和栈;Set 全整数且量小时用 intset 整数数组,去重加交集并集,适合"共同好友"这种场景;Zset 用跳表加哈希表,跳表按分值有序、O(log N) 插入查询,哈希表存成员到分值的映射,所以排行榜、Top N 都靠它,而且跳表实现简单、范围查询天然友好,这是它而不是红黑树的原因。另外衍生类型,比如 Geo 存经纬度、Bitmap 做位图、HyperLogLog 做基数统计,都是在 String 之上封装。

【边界】 当然,这些底层编码不是固定的——Hash、List、Set 在数据量小的时候会用 ziplist、intset 这种紧凑结构省内存,一旦超过阈值(比如哈希字段数超 512)就升级为哈希表或 quicklist,所以问"类型"要连着"编码转换"一起答,才显得真正懂 Redis。

面试记录 2026-10-30(第 1 次)

题目:对于redis的数据类型了解么简单说下

难度:low

标签:real-interview, db/mysql/concepts, company/vipkid

评分:⭐⭐⭐☆☆(3/5)

我的回答

Redis 的数据类型是 Redis 很核心的一个内容。主要的数据类型包括 KV 字符串,或者不是字符串,它内部会划分成字符串纯数字各种方式。它内部根据传入的数据不同会有不同的定义,但外侧展现就是 KV。然后其他的包括还有哈希。很核心的一个哈希,在哈希中基本上我们会存一些对象,把一组缓存全存进去,然后逐个拿出。拿的时候可以按字段拿,而不是整个都拿出。对比前一个 KV 字符串。它的优势就是可以拿部分内容,而不是一次性把全量的拿出来。再有就是 List 存放双端队列存放数据,存放类似列表也好,存放东西也好,可以顺序的或逆序的把东西拿出来。当然也可以拿中间的。然后就是集合 Set,Set 就是存放不重复的数据,在 SET 中,我们一般可以用来做交集、并集之类的操作。比如说我的朋友圈做朋友圈之类的功能,我的朋友圈和你的朋友圈有什么交集这种东西。再之后就是 Zset,也就是有排序的集合。它使用的方式,我们一般可以用它来做排列、队列、Top N,然后排序、排行榜之类的东西。常规的就这 5 个了,然后就是一些衍生的,比如位置信息,它有一个专门的类型存放位置信息,还有 Bitmap 做位记录的映射。

点评

优点:5 种核心类型全覆盖 + 衍生类型(Geo/Bitmap);Set 交集做朋友圈、Zset 排行榜的场景举例准确;Hash 按字段取 vs String 全量的取舍点到位。

不足:只讲了"用途",没讲每种类型的底层数据结构(SDS、quicklist、intset、skiplist、ziplist→hashtable 编码转换),深度停在表层。

补充:Redis 类型题要"表面用途 + 底层结构"两层答,底层编码转换(ziplist/intset 小数据紧凑、超阈值升级)是高频追问点。

完整讲解见上方「完整讲解(权威版)」