MST

星途 面试题库

面试题:Redis在大数据量场景下如何优化存储结构

在大数据量场景中,Redis的常用数据结构如String、Hash、List、Set和ZSet,各自在存储优化方面有哪些特点和适用场景?举例说明如何根据业务需求选择合适的数据结构以达到更好的存储优化效果。
46.8万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

String

  • 特点:简单的键值对存储,value 最大可存储 512MB 数据。结构简单,读写性能极高。
  • 适用场景
    • 缓存:常用于缓存数据库查询结果,如用户信息、文章内容等。例如缓存用户的基本信息,key 为 user:123,value 为用户 JSON 格式数据。
    • 计数器:利用 INCRDECR 等命令实现计数功能,比如记录网站的访问量,key 为 page:visit:count,每次访问执行 INCR 操作。
  • 存储优化:适合存储相对简单且独立的数据,避免存储大对象,减少内存占用。

Hash

  • 特点:以字段 - 值的形式存储,类似对象。适合存储对象数据,相较于 String 存储对象更节省内存,因为 String 存储对象需序列化整个对象,而 Hash 只需存储各字段值。
  • 适用场景
    • 存储用户信息:key 为 user:123,field 为 nameageemail 等,value 为对应的值。
    • 商品信息存储:key 为 product:456,field 为 titlepricedescription 等,便于对商品属性进行管理。
  • 存储优化:当存储对象属性有增删改操作时,Hash 结构更灵活高效,且能有效减少内存碎片化。

List

  • 特点:基于链表结构实现,支持左右两端插入和弹出元素。有序可重复,可根据索引获取元素。
  • 适用场景
    • 消息队列:生产者向 List 左侧 LPUSH 消息,消费者从右侧 RPOP 消息,实现异步处理。例如订单处理消息队列,将订单相关信息作为消息存入 List。
    • 历史记录:记录用户操作历史,如用户浏览商品历史,每次浏览新商品 LPUSH 到 List,可通过 LRANGE 获取一定数量历史记录。
  • 存储优化:在需要有序且可重复存储数据场景下,List 结构有较好性能,避免频繁插入删除中间位置元素,减少链表操作开销。

Set

  • 特点:无序且元素唯一,内部实现基于哈希表。支持交集、并集、差集等集合运算。
  • 适用场景
    • 标签系统:为用户或商品设置标签,如用户标签集合,key 为 user:123:tags,value 为各个标签,可快速判断用户是否有某个标签。
    • 去重统计:统计网站 UV(独立访客),每次访问将用户 ID SADD 到 Set 中,SCARD 获取 Set 元素个数即 UV。
  • 存储优化:在需要去重且无序存储场景下表现良好,集合运算高效,但要注意避免存储过多元素导致哈希冲突。

ZSet

  • 特点:有序且元素唯一,每个元素关联一个分数(score),通过分数排序。
  • 适用场景
    • 排行榜:如游戏玩家排行榜,key 为 game:rank,member 为玩家 ID,score 为玩家积分,通过 ZRANGEBYSCORE 可获取不同排名段玩家。
    • 按权重调度:任务调度系统中,将任务放入 ZSet,score 作为任务权重,调度器按分数从高到低获取任务。
  • 存储优化:根据业务对排序的需求合理设置 score,避免 score 分布不均导致查询性能下降。

业务需求选择示例

假设开发一个电商系统,有如下业务需求:

  1. 缓存商品基本信息:商品信息为对象,包含名称、价格、描述等,使用 Hash 结构,key 为 product:商品 ID,field - value 为各属性。
  2. 记录商品浏览记录:需记录用户浏览商品顺序,使用 List 结构,key 为 user:用户 ID:browse_history,将浏览商品 ID 依次 LPUSH 到 List。
  3. 统计商品收藏用户数:需去重统计,使用 Set 结构,key 为 product:商品 ID:collect_users,将收藏用户 ID SADD 到 Set。
  4. 商品销量排行榜:按销量排序,使用 ZSet 结构,key 为 product:sales_rank,member 为商品 ID,score 为商品销量。