面试官:Redis 有几种数据类型?我:8 种?然后面试官就让我过了
哥们儿,面试被问 Redis 数据类型,你还搁那数 “String、Hash、List……”?停!这么答就亏大了!
今天给你整点干的,不光那 5 个基础的,还有 3 个贼好用的特殊类型,附带实战怎么用、面试怎么装(不是),看完直接拿去用,不好使你找我!
一、基础五兄弟(别光说名字,得讲人话)
1. String —— 啥都能塞的 “万能口袋”
它不光能存文本,数字、图片、序列化对象…… 都能往里怼,底层是 SDS,比 C 语言字符串安全多了。
实战用法:缓存用户信息、统计点赞数(INCR 原子操作)、分布式锁(SETNX + 过期 + Lua 脚本,现在直接上 Redisson 看门狗自动续期)。
面试装一下:“我们项目用 String 做计数器,INCR 原子操作不怕并发。锁?现在都用 Redisson 的看门狗,SETNX 那是上古玩法。”
2. Hash —— 对象的 “贴身管家”
存用户信息时,你可以单独改年龄,不用把整个对象序列化再存回去,更新效率比 String 存 JSON 高到不知哪里去了。
实战用法:
# 别再用String存整个JSON了!
HSET user:1001 age 26
面试提一嘴:“Hash 更新字段特省事,特别适合那种经常部分更新的对象,比如用户资料。”
3. List —— 简单的 “消息队列小能手”
记住俩字:“顺序”。像朋友圈时间线、最新评论,它很拿手。头尾操作(LPUSH/RPOP)飞快,但中间插队慢,所以只适合做队列或最新列表。
面试场景:“我们活动日志就用 List 当队列,生产者 LPUSH,消费者 RPOP,轻量又省心。”
4. Set —— 搞 “社交” 和 “抽奖” 的
核心:“不重复”,还能求交集、并集。
实战用法:
# 共同好友?
SINTER user:A:friends user:B:friends
# 抽奖?
SPOP lucky:users 3 # 随机抽3个,公平!
面试聊这个:“Set 求交集太方便了,社交关系一眼看清。”
5. ZSet —— 排行榜 “专业户”
带分值的 Set,自动按分数排序,底层是跳表,范围查询快。还能用 score 存时间戳做延时队列。
面试深一点:“我们游戏排行榜、热销榜都用它。延时队列也靠它,score 存未来时间戳,到点消费。”
二、三个 “特种部队”(亮出来就加分)
1. Bitmap —— 省内存省到 “抠门”
按位存储,1 字节存 8 个状态,1MB 能存 800 万个状态!用户签到、在线状态用它绝了。
实战用法:
# 用户ID 50007 第3天签到了
SETBIT sign:2024:05 50007 1
# 看看第3天有几人签
BITCOUNT sign:2024:05
面试震撼他:“100 万用户 7 天签到,用 Bitmap 不到 1M 内存,用 Set 可能上百兆。”
2. HyperLogLog —— “大概齐” 的神器
统计不重复数量(比如 UV),12KB 内存敢统计上亿数据,误差不到 1%。
面试说人话:“UV 不需要精确到谁看了,只要个大概数,用 HLL 内存省得吓人。”
3. Geo —— 找 “附近的人”
底层是 ZSet,把经纬度转成数字存起来。
实战用法:
GEORADIUS nearby:shops 116.40 39.90 5 km WITHDIST COUNT 10
面试场景:“外卖 App 找附近店铺就用这个,响应巨快。”
📋 一张 “作弊小纸条”
| 类型 | 当成啥 | 最适合场景 | 面试点睛(一句话) |
|---|---|---|---|
| String | 万能抽屉 | 缓存、计数器、分布式锁 | 原子操作稳如狗,锁现在都用 Redisson 看门狗。 |
| Hash | 可单独开格子的收纳盒 | 用户信息、商品属性 | 更新字段比 String 存 JSON 高效太多。 |
| List | 两头进出的单行隧道 | 消息队列、最新评论、时间线 | 头尾操作快,中间插队慢,别用它干不擅长的事。 |
| Set | 不重复的数学工具箱 | 共同好友、抽奖、标签系统 | 一句 SINTER 算出共同好友,社交功能瞬间搞定。 |
| ZSet | 带成绩单的精英排行榜 | 游戏榜、热销榜、延时任务 | 底层跳表,范围查询快,score 存时间戳做延时队列。 |
| Bitmap | 极省空间的开关墙 | 用户签到、在线 / 离线状态 | 100 万用户签到,内存占用不到 1M,省内存大王。 |
| HyperLogLog | “大概齐” 的计数器 | UV 统计、巨型去重计数 | 12KB 存亿级数据,误差不到 1%,要精确值别找它。 |
| Geo | 内置地图的小助手 | 附近的人、附近门店、LBS 服务 | 底层是 ZSet 马甲,一句 GEORADIUS 搞定附近搜索。 |
❓ 最后,可能会被追问的
- ZSet 为什么用跳表不用红黑树?(跳表实现简单,范围查询更方便,并发友好)
- 小 Hash 为什么用压缩列表?(数据小时,压缩列表内存更紧凑,利用率高)
- Set 和 Bitmap 到底用哪个?(要存具体 ID 用 Set,只关心在不在线 / 签没签到用 Bitmap)
觉得有用,转发给你的面试搭子,卷他!
关注公众号:开心编程语录,更多面试与实战分享等你来。
唠一句:你们用 Redis 干过最骚的操作是啥?评论区让我开开眼!