Redis 常用数据类型
下面给你一套面试最标准、逻辑清晰、直接背诵的版本:
Redis 常用数据类型 + 使用场景 + 底层原理 + 面试话术,一次性讲全。
一、开场一句话(必说)
Redis 是基于内存的高性能 KV 数据库,支持丰富的数据结构,通过不同类型实现缓存、限流、分布式锁、计数器、消息队列、排行榜、去重等场景。
核心优势:单线程 + IO多路复用 + 纯内存操作,高并发、低延迟。
二、5+3 种核心数据类型 + 场景(面试高频)
1. String(字符串)
底层:简单动态字符串 SDS
常用命令:set、get、incr、decr、setnx、append
场景:
- 对象缓存(用户信息、商品信息 JSON)
- 分布式锁(setnx + 过期)
- 计数器(点赞、阅读量、库存)
- 限流(incr 统计单位时间请求数)
- 分布式 Session
2. Hash(哈希)
底层:ziplist / hashtable
场景:
- 缓存结构化对象(用户详情、商品详情)
- 频繁更新的属性(只改单个字段)
比 String 更省内存、更灵活。
3. List(列表)
底层:ziplist / quicklist
场景:
- 简单消息队列、任务队列
- 栈、队列结构
- 最新列表(最新评论、最新动态)
4. Set(集合)
底层:intset / hashtable
特点:无序、去重
场景:
- 去重(签到、UV统计)
- 共同好友、共同关注(交集 sinter)
- 随机抽奖(spop)
5. ZSet(有序集合)
底层:ziplist / skiplist 跳表
特点:排序 + 去重
场景:
- 排行榜(积分、销量、热度)
- 延时队列(score 存时间戳)
- 排序类业务
三、高级数据类型(加分项)
6. Bitmap(位图)
基于 String 实现
场景:
- 海量用户签到
- 在线状态
- 用户行为筛选(极大省内存)
7. HyperLogLog
场景:
- 大数据量 UV、独立访客统计
- 允许极小误差,内存极低
8. GEO(地理信息)
场景:
- 附近的人、附近门店
- 距离计算
四、面试标准回答话术(直接背)
面试官问:Redis 有哪些数据类型?分别用于什么场景?
你这样回答最稳:
Redis 常用的数据类型主要有 5 种基础类型和几种高级类型。
- String:用于缓存对象、分布式锁、计数器、限流、Session。
- Hash:适合存储结构化数据,比如用户信息、商品信息,支持部分字段更新。
- List:用作简单队列、栈,或者最新列表。
- Set:利用去重特性做 UV 统计、共同好友、随机抽奖。
- ZSet:内部是跳表实现,用于排行榜、延时任务、排序业务。
高级类型还有 Bitmap 用于签到、HyperLogLog 做大数据量去重统计、GEO 实现附近的人等。
不同结构对应不同业务场景,可以在高并发下高效解决缓存、计数、队列、排序等问题。
五、高频追问(必背答案)
1. ZSet 底层为什么用跳表?
跳表查询、插入、删除都是O(logN),实现简单、性能高,比平衡树更适合 Redis。
2. 为什么用单线程还这么快?
- 纯内存操作
- IO多路复用(epoll/kqueue)
- 避免多线程切换开销
- 简单高效的数据结构
3. 缓存穿透、击穿、雪崩怎么解决?
- 穿透:布隆过滤器 / 缓存空值
- 击穿:互斥锁 / 热点数据永不过期
- 雪崩:过期时间随机 + 集群高可用 + 降级
4. 分布式锁用什么类型?
String,set key value NX PX原子命令。
5. 延时队列用什么?
ZSet,score 存时间戳,轮询获取到期任务。
