学会这一篇,Redis 数据结构题全拿下!(附经典场景举例)

69 阅读6分钟



大家好呀,我是小米,一个喜欢边写代码边喝咖啡的31岁程序员。

最近在帮一位朋友准备社招面试,结果被一道 Redis 题给“整不会”了。面试官问得云淡风轻:“Redis 有哪些常见数据类型?分别能干嘛?”

我朋友当场懵了三秒:“呃……String、List、Set,还有……呃……SortedSet?”

面试官轻轻一笑:“那它们的应用场景呢?”

空气,突然安静。

于是我就决定写下这篇文章,帮大家一次性把 Redis 的五大核心数据类型 讲明白,还会聊点“面试加分细节”,让你不仅知道“是什么”,更能说出“为什么”和“什么时候用”。

因为啊,面试官最喜欢的,不是死记硬背,而是“有画面感”的理解。

String:Redis 的“万能类型”

先说最基础的 —— String

别看名字叫“字符串”,其实它是最“多才多艺”的数据类型。

在 Redis 里,String 可以存任何东西:文本、JSON、序列化后的对象、甚至二进制数据(比如图片、音频片段都能放)。

举个例子:

你想在系统里缓存用户信息。那可以这样搞:

下次查就不必连数据库,直接从 Redis 里拿。

那它的常见用法有哪些?

  • 缓存热点数据(比如用户资料、商品信息)
  • 计数器:Redis 的 INCR、DECR 操作可以原子地自增自减,非常适合计数场景,比如点赞数、浏览量。
  • 分布式锁:用 SETNX(set if not exist)实现简单分布式锁机制。

面试官如果继续追问:“String 的最大存储限制是多少?”

你可以轻轻一笑回答:512MB! 然后再补一句:“不过,一般不会放那么大,超过 1MB 的数据就不适合放 Redis 里了。”

这就是加分点。

List:Redis 的“队列好帮手”

List 是 有序的字符串列表,它的底层是 双向链表

也就是说,你既可以从左边插入、也可以从右边插入。所以,List 在 Redis 里非常适合做:

  • 消息队列(模拟 Kafka 那种生产消费模型)
  • 任务异步处理(比如邮件发送、订单延迟处理)
  • 最新动态列表(比如朋友圈、评论区)

举个例子:

然后用 LRANGE news 0 1 就能取到最新的两条新闻。

这里你可以顺势说一句:

“List 的操作复杂度主要是 O(1),但是访问中间元素时是 O(n),所以更适合做头尾操作。”

面试官听到这句话,基本就会点头:“嗯,这哥们平时用过。”

Set:Redis 的“去重神器”

有时候,我们不需要顺序,只想要一个 不重复的集合,那就用 Set。

Set 是 Redis 里的一种无序集合,最显著的特点是:元素自动去重。那它能干嘛?太多了!

  • 抽奖系统:用 Set 存参与用户,每次随机取一个中奖者。
  • 共同好友:Redis 的 Set 支持交集、并集、差集,非常方便计算“共同关注”之类的功能。
  • 去重统计:比如统计一天访问网站的唯一用户数(UV)。

一个经典面试问题是:

“你怎么用 Redis 统计用户每天的活跃人数?”

回答思路就是:

每天创建一个 Set,key 里带日期,比如 active:2025-11-04,然后每当有用户访问就 SADD 用户ID。

统计活跃人数只需要看 SCARD active:2025-11-04。

面试官会很喜欢这种“场景化”的回答。

Hash:Redis 的“小型数据库表”

接下来登场的是 Redis 中我最喜欢的类型 —— Hash

Hash 就像是一张表,key 是表名,field 是列名,value 是值。比如:

它非常适合存储结构化数据,比如用户信息、商品信息等。

常见用法:

  • 存储对象(用户、商品、订单)
  • 购物车结构(key 是用户,field 是商品ID,value 是数量)
  • 动态数据更新(只改字段,不改整个值)

如果你跟面试官说:

“相比 String 存整个 JSON,Hash 更新更细粒度、性能更高,还能节省带宽。”

那他八成会露出“懂行人”的表情:

“好,咱们可以聊聊 pipeline 了。”

ZSet(Sorted Set):Redis 的“排行榜之王”

终于到了最有“灵魂”的数据类型:ZSet(有序集合)

ZSet 就是带了分数(score)的 Set。每个元素都关联一个分数,Redis 会自动按分数排序。

用途场景:

  • 排行榜(比如游戏积分榜、热搜榜)
  • 延迟任务队列(score 代表时间戳)
  • 优先级队列(score 代表优先级)

比如:

执行 ZRANGE rank 0 -1 WITHSCORES 就能拿到从低到高的完整排行榜。

面试官可能会加问:

“ZSet 和普通 Set 的底层结构有什么不同?”

你可以答:

“ZSet 是通过 SkipList(跳表)实现排序,查找和插入的复杂度是 O(logN),Set 是哈希表实现的,复杂度是 O(1)。”

这时候,他会轻轻点头,然后把笔记下:“值得关注”。

延伸:Redis 新增的数据类型(面试加分)

如果你想在面试中多拿几分,可以提一嘴 Redis 的“新面孔”:

  • Bitmap:用于位统计(比如签到、用户活跃天数)
  • HyperLogLog:用于近似去重计数(比如统计网站独立访问量)
  • Geo:地理位置存储,可计算两点间距离
  • Stream:消息流,用于实现可靠的消息队列系统

别怕背不完,你只需要挑一两个说说用途就行。

比如:

“Bitmap 很适合做签到系统,一个 bit 就代表一天,既省内存又方便统计连续签到天数。”

这类回答不仅展示了知识广度,还体现你平时动过脑子。

总结:Redis 不只是缓存

到这,我们已经把 Redis 的核心类型讲完了。

但我想说一句心里话:

Redis 绝不是一个“简单的缓存工具”,而是一种“高性能数据结构引擎”。

它的每一种类型,都代表了一个经典的算法思路。比如:

  • String 是基础类型;
  • List 是链表;
  • Set 是集合;
  • Hash 是哈希表;
  • ZSet 是跳表。

理解这些底层结构,你才能真正用好 Redis。

面试官想听的不是答案,而是思考

最后,给你一个“社招必杀技”:

当面试官问“Redis 有哪些数据类型”时,别直接背诵。

你可以这样回答:

Redis 有五种核心数据类型:String、List、Set、Hash、ZSet。

String 用于缓存与计数,List 适合队列,Set 用于去重和集合运算,Hash 用来存对象,ZSet 用来做排行榜。

此外还有 Bitmap、HyperLogLog、Geo、Stream 等高级类型。

我在项目里主要用 String 做缓存,Hash 存对象,ZSet 做积分榜,Set 做共同好友计算。

简洁、有逻辑、有实战,这就是社招面试的黄金答案。

END

Redis 的数据类型,就像程序员的工具箱。

别只背名字,学会在正确的地方用出正确的 “锤子” ,那你就是 Redis 的工匠。

我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!