面试官:Redis有几种数据类型?我:8种?然后面试官就让我过了

0 阅读4分钟

面试官: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 干过最骚的操作是啥?评论区让我开开眼!