Redis 的基础数据结构有哪些,各自用于什么场景?

考查重点:数据类型与业务操作匹配。String 做值缓存/计数,Hash 按字段改对象,List 做顺序队列,Set 去重,ZSet 按分数排行

本题目录

参考答案

核心回答

Redis 常见的五种基础数据类型是 String、Hash、List、Set 和 Sorted Set(Zset)。选择时看需要怎样访问和修改数据:

  • String:保存一个字节串,适合缓存整份 JSON、保存令牌或使用原子自增计数。
  • Hash:在一个键下组织多组字段和值,适合用户信息、商品属性、购物车等需要按字段读写的对象。
  • List:有顺序、允许重复的字符串序列,支持两端插入和弹出,适合近期记录、简单待处理列表等。
  • Set:无序且成员唯一,支持成员判断和交并差,适合去重、标签集合、共同关注。
  • Zset:成员唯一,每个成员关联一个分数,适合按分数排序、取排名或查范围,例如积分榜和按时间排序的任务索引。

这里说的是对外的数据模型,不等于底层编码。Redis 也有 Bitmap、HyperLogLog、GEO、Stream 等其他能力,不能把“五种基础类型”理解成所有版本只有五种类型。

对象缓存:String 和 Hash 怎么选?

如果商品详情通常整份读取、整份更新,可以把序列化 JSON 存成 String,读写方式简单。但 Redis 把这份 JSON 当字节串,普通 String 命令不会按 JSON 路径理解内部字段。

如果经常只读取名称、修改库存展示值或更新某个属性,Hash 可以直接按字段访问,减少整份对象的传输和序列化。购物车也可以把商品 ID 作为 field、数量作为 value,利用字段更新和增量操作管理内容。

两种方式都不是普遍更省内存:字段数量、内容长度、底层编码、键的组织方式都会影响占用。Hash 也不是任意嵌套的对象数据库,复杂结构仍需要合适的序列化或其他模型。

并发修改时还要考虑动作本身。多个客户端分别读整份 JSON、修改不同字段再覆盖,可能互相丢失更新;按字段操作可以缩小影响范围,但涉及多个字段的业务条件,仍要使用合适的原子操作或并发控制。

List、Set 和 Zset 的“顺序”有什么不同?

List 的顺序由插入位置和后续操作决定,成员可以重复。 例如聊天消息按一端写入,再按约定顺序读取历史。两端操作是常用优势;按位置查找、取大范围记录仍有遍历与返回成本,不能把所有操作都当成常数时间。

Set 不承诺插入顺序,也不保存重复成员。 比如每个用户的关注人集合,可以做成员判断或求共同关注。适合“有没有、是否重复、两个集合有什么关系”,不适合直接表达先后顺序或分数排名。

Zset 的成员唯一,但分数可以相同。 同分时按成员的字节字典序进一步排序;如果要按“谁先达到分数”决定名次,需要另行表达该业务规则,不能默认同分按写入先后排序。更新同一成员的分数,会调整它的位置,不会自动增加一份相同成员。

例如积分榜用 Zset 能直接查名次和分数范围,用 List 则需要自己维护位置;反过来,完整记录每次积分变更事件时,不能只靠 Zset 中该成员当前的一项分数代替历史。

什么时候考虑 Bitmap、HyperLogLog 和 GEO?

它们服务于更具体的查询需求:

  • Bitmap:用位表示某对象的某个二值状态,例如签到或是否活跃。它是在 String 上进行的位操作;偏移很大而对象很稀疏时,不一定省空间。
  • HyperLogLog:估算去重后的数量,例如访问用户数。它不保存可供逐个取回的完整成员集合,不适合要求精确名单或精确去重数的场景。
  • GEO:按地理位置查询附近成员、计算距离等;它提供地理语义,不等于任意复杂空间分析数据库。

如果需要可重复读取的事件记录或消费组等能力,可以进一步比较 Stream。用 List 弹出一个元素,只代表它已从列表取走,不自动代表对应业务已处理成功;消息可靠性还涉及确认、重试与持久化等设计。

常见追问

为什么计数用 INCR,不先 GET 再 SET? 单条自增在 Redis 中原子完成,避免多个客户端读到相同旧值后相互覆盖。若计数还要和过期、额度或外部扣款一起形成业务动作,仍需分析这些操作之间的原子范围。

Redis Hash 与整个 Redis 的键空间有什么区别? 键空间是键到 Redis 对象的映射,值可以是 String、List、Hash 等;Hash 则是某一个键对应的字段集合。不能因为都涉及映射,就把所有 Redis 值都叫 Hash。

同一种类型为什么还会有多种底层结构? Redis 会根据版本、数据规模和配置选择紧凑编码或其他结构,平衡内存与访问开销。面试先说明对外语义和主要操作,再按具体版本展开实现;不要把历史版本的编码表当成永远不变的对应关系。

对应教程

  • 第 16 章:记忆与对话历史:§5.2.4~5.2.6 展示按 session 保存序列化消息、查看类型和读取列表的场景,帮助理解“历史消息”怎样落到实际数据类型;其他类型的选型由本文补充。

参考资料

  • 国内:JavaGuide:Redis 5 种基本数据类型详解:借鉴五种类型的操作和应用场景,组织正文中 String、Hash、List、Set 与 Zset 的数据模型和选型说明。
  • 国内:JavaGuide:Redis 3 种特殊数据类型详解:采用签到、近似去重计数与地理位置的例子,解释正文中 Bitmap、HyperLogLog、GEO 分别保留的信息和适用查询。
  • 国内:小林 coding:Redis 常见数据类型和应用场景:参考对象缓存、购物车和列表消费的讨论,比较正文中整份 JSON 与按字段读写的取舍,并说明弹出列表元素与业务处理完成的区别。
  • 国外:Redis:Strings:字节串与原子计数部分明确 String 保存的是什么,以及为什么自增与客户端先读再写具有不同的并发行为。
  • 国外:Redis:Sorted sets:成员唯一、分数排序与同分字典序的约定,说明积分榜怎样排序,以及为何不能默认同分按插入时间排列。

相关面经

25 篇

麒麟软件

后端研发工程师
一面
查看原面经 →
Redis 有哪些常见的数据类型?

公司未注明

后端开发工程师
查看原面经 →
Redis等中间件的使用是你自己实操的吗?请列举你用到的Redis数据结构及其应用场景。

亚信科技

后端开发
实习
查看原面经 →
Redis 支持哪些数据结构?底层有什么优化机制?

网易云音乐

全栈开发 / 后端开发实习
实习秋招一面
查看原面经 →
常用基本数据类型?

快手

后端开发工程师
秋招二面
查看原面经 →
redis有哪些数据类型?
展开剩余 20 篇面经

公司未注明

测试开发岗
一面、二面、三面
查看原面经 →
Redis常用数据结构,什么场景会出现大key,大key带来什么风险。

恒生电子

AI应用开发
秋招一面
查看原面经 →
Redis 基础:Redis 有哪几种数据结构?

客诺信息技术

后端开发工程师
一面、二面
查看原面经 →
Redis中常见的数据结构
对于这些数据结构常见使用的API有哪些

快手

测试开发
一面
查看原面经 →
redis知道吗,讲讲你熟悉的(三大缓存、主从复制AOF RDB区别)

腾讯

后端开发工程师
实习一面
查看原面经 →
Redis 的基础数据类型以及底层实现原理了解吗?

靖安科技

后端工程师(RAG/Agent 项目)
秋招一面
查看原面经 →
Redis 有几种数据结构

知乎

全栈开发工程师
秋招一面
查看原面经 →
redis的数据结构有哪些

快手

Agent 开发
日常实习一面
查看原面经 →
他问了Go channel是不是并发安全,channel和mutex的区别,GMP调度,本地队列为空时怎么偷任务。然后又问Redis为什么快、支持哪些数据结构、怎么做类似淘宝搜索框的实时模糊搜索。最后还问了扫码登录完整流程、服务注册发现、Nacos/Consul心跳。

小红书

Agent 开发
实习一面
查看原面经 →
Redis有哪些常见数据结构?不同数据结构底层实现原理分别是什么?

字节跳动

后端开发工程师
社招一面、二面、三面
查看原面经 →
讲一讲 redis 的常用数据结构?

滴滴

AI Agent 后端开发
查看原面经 →
Redis 支持哪些数据结构?

字节跳动

后端开发工程师(AI / Agent 方向)
二面
查看原面经 →
Redis底层基础数据结构有哪些,各自用途?

阿里巴巴

后端开发
日常实习一面
查看原面经 →
Redis的常用数据类型有哪些?分别适用什么场景?

用友、太平洋网络

面经合集
查看原面经 →
redis基本数据结构哪些+运用场景,

阿里巴巴

后端开发工程师(AI)
实习一面
查看原面经 →
Redis的常用数据类型有哪些?分别适用什么场景?

美团

全栈开发工程师
一面
查看原面经 →
redis的基础数据类型

阿里国际

AI 应用开发
一面、二面
查看原面经 →
Redis的数据类型以及使用场景

美团

后端开发工程师
暑期实习一面
查看原面经 →
Redis 支持哪些数据类型?

字节跳动

后端开发(Agent 方向)
实习春招一面
查看原面经 →
Redis支持哪些数据结构

字节跳动

后端开发工程师
一面
查看原面经 →
Redis 常见的五种数据结构是什么?

收录题集

2 个来源,共2 份题集

相关题目

4 题