首次来源:vipkid 2021 一面
对于redis的数据类型了解么?简单说下
最后更新:2026-10-30 · 基于第 1 次作答
结论:Redis 的 5 种核心类型是 String/Hash/List/Set/Zset,面试要"表面用途 + 底层结构"两层答。 关键词:SDS · quicklist · skiplist · 整数数组 · ziplist 边界:衍生类型 Geo/Bitmap/HyperLogLog 是在 String 之上封装,不是独立底层结构。
核心考点定位:Redis 类型题,面试官真正想听的是"这个类型为什么快 + 底层怎么存",而不是单纯背用途清单。
机制链(≥3 环):
证据锚点:
SDS:String 的底层,C 字符串的 O(N) 求长升级为 O(1),且二进制安全。quicklist:List 底层 = 双向链表 + ziplist 节点,兼顾两端 O(1) 操作与内存紧凑。skiplist:Zset 底层之一,跳表实现有序,查询/插入 O(log N),与哈希表配合存成员→分值。intset:Set 全整数且量小时用整数数组,查找二分。对比与权衡:
| 类型 | 底层(小→大) | 典型场景 | 关键 API |
|---|---|---|---|
| String | SDS | 缓存、计数器、分布式锁 | SET/GET/INCR |
| Hash | ziplist → hashtable | 对象字段存储 | HGETALL/HSET |
| List | quicklist | 队列/栈、消息流 | LPUSH/RPOP/LRANGE |
| Set | intset → hashtable | 去重、交集/并集 | SADD/SINTER |
| Zset | ziplist → skiplist+dict | 排行榜、Top N | ZADD/ZRANGEBYSCORE |
常见误区:
适用边界:如果追问"百万级排行榜",需进一步讲 skiplist 的 span 字段如何 O(log N) 定位排名,而非简单列举。
【结论】 面试官您好,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。
题目:对于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 小数据紧凑、超阈值升级)是高频追问点。
完整讲解见上方「完整讲解(权威版)」