面试官:Redis 有哪些常用的数据类型?它们分别适合什么应用场景?

面试回答

Redis 常用的数据类型主要有 StringListHashSetZset。回答这类问题时,不能只背类型名称,更重要的是说明它们解决的是什么数据建模问题。

String 是最基础的类型,可以存字符串、整数、二进制数据,常用于缓存对象、计数器、分布式锁里的锁值。List 是有序列表,适合做消息队列、任务队列、时间线这类按插入顺序处理的数据。Hash 适合存对象的多个字段,比如用户信息、商品信息,字段级读写比把整个对象序列化成字符串更灵活。Set 是无序去重集合,适合做标签、共同好友、点赞去重、抽奖去重。Zset 是带分数的有序集合,适合排行榜、延迟队列、按时间排序的动态列表。

简单总结,选 Redis 数据类型时看三个维度:是否需要顺序、是否需要去重、是否需要按分数排序。如果只是键值缓存,用 String;如果是对象字段,用 Hash;如果要保持插入顺序,用 List;如果要去重,用 Set;如果要排序和范围查询,用 Zset

系统讲解

核心对比

类型数据特征常见命令典型场景
String单个值,最大可存储 512 MB,值可以是字符串、整数或二进制内容SETGETINCRSETNX缓存、计数器、限流计数、分布式锁值
List按插入顺序排列,可从两端读写LPUSHRPUSHLPOPBRPOP任务队列、消息队列、最新动态列表
Hash一个键下面有多个字段和值HSETHGETHMGETHINCRBY用户对象、商品对象、购物车
Set无序、自动去重,支持集合运算SADDSISMEMBERSINTERSUNION标签、共同好友、点赞去重、黑名单
Zset去重成员加分数,按分数有序ZADDZRANGEZREVRANGEZRANGEBYSCORE排行榜、延迟队列、按时间排序的 Feed

类型选择思路

如果业务只需要通过一个 key 找到一个 value,优先使用 String。例如缓存登录态、缓存 JSON 字符串、记录文章阅读数。String 还支持原子自增,所以计数器和固定窗口限流也经常用它实现。

如果业务数据本身是一个对象,并且经常只读写其中部分字段,Hash 会更合适。例如用户资料有昵称、头像、积分等字段,使用 Hash 可以单独更新积分,不必每次读出整个 JSON 再写回。

如果业务关注插入顺序,使用 List。典型例子是任务队列:生产者用 LPUSH 写入任务,消费者用 BRPOP 阻塞读取任务。不过在更严格的消息队列场景里,还要考虑消息确认、重试和消费组,这时 Redis 的 Stream 通常比 List 更合适。

如果业务核心是去重和集合运算,使用 Set。例如判断用户是否点赞、统计共同关注、维护某个活动的参与用户集合。Set 的优势不是排序,而是成员唯一和交并差运算。

如果业务既要去重,又要按某个权重排序,使用 Zset。排行榜通常把用户 ID 作为 member,把分数作为 score;延迟队列通常把任务 ID 作为 member,把执行时间戳作为 score,然后按 score 范围取出到期任务。

代码示例

下面用 Redis 命令展示几个典型建模方式:

# String:文章阅读数
INCR article:1001:views
GET article:1001:views
 
# Hash:用户对象字段
HSET user:42 name "Alice" score 100
HINCRBY user:42 score 10
HGETALL user:42
 
# Set:点赞去重
SADD article:1001:liked_users 42
SISMEMBER article:1001:liked_users 42
 
# Zset:排行榜
ZADD rank:weekly 9800 user:42
ZREVRANGE rank:weekly 0 9 WITHSCORES

常见追问

追问:缓存对象时,应该用 String 存 JSON,还是用 Hash

如果对象经常整体读写,用 String 存 JSON 更直接,序列化和反序列化也方便。如果对象字段很多,并且经常只更新某几个字段,用 Hash 更合适,因为它支持字段级读写。实际项目里还要考虑一致性和复杂度:Hash 字段粒度更细,但如果业务层仍然需要完整对象,过度拆字段可能反而增加维护成本。

追问:为什么排行榜通常用 Zset

排行榜需要两个能力:用户不能重复上榜,并且要按分数排序。Zset 正好同时满足这两个条件。member 保证唯一,score 用来排序,ZREVRANGE 可以取 Top N,ZRANKZREVRANK 可以查询某个用户的排名。

追问:Redis 只有这五种数据类型吗?

不是。除了这五种基础类型,Redis 还提供 BitmapHyperLogLogGeoStream 等结构。面试中先讲清楚五种基础类型,再补充这些扩展结构,会显得回答更完整,但不要把它们混在一起背成一串命令列表。