MST

星途 面试题库

面试题:复杂业务查询中Redis与MySQL数据架构设计

假设一个电商系统,需要支持商品详情查询、热门商品推荐等复杂业务。请设计一个合理的Redis与MySQL结合的数据架构,说明每个部分的作用以及数据的读写流程,包括如何利用Redis的特性提高查询性能。
50.0万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

数据架构设计

  1. MySQL:作为关系型数据库,用于存储电商系统的核心数据,如商品的详细信息(包括商品描述、规格、价格、库存等)、用户信息、订单信息等。它提供了数据的持久化存储,确保数据的完整性和一致性,支持复杂的事务处理,比如商品的库存扣减与订单创建的原子操作。
  2. Redis:作为缓存数据库,存储高频访问的数据,例如商品详情页数据、热门商品列表等。Redis基于内存存储,读写速度极快,能够显著提高查询性能。同时,Redis支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),方便根据不同业务需求进行数据存储和操作。

各部分作用

  1. MySQL
    • 数据持久化:保证数据长期稳定存储,即使系统重启或故障,数据也不会丢失。
    • 复杂数据管理:支持复杂的表结构设计和关系建模,便于处理电商系统中各种复杂业务逻辑,如商品与分类、品牌、供应商的关联关系等。
    • 事务处理:确保涉及多个操作的业务逻辑具有原子性、一致性、隔离性和持久性(ACID特性),例如订单创建过程中的库存扣减、金额计算和订单记录插入等操作。
  2. Redis
    • 缓存加速:将频繁访问的数据存放在内存中,大大减少对MySQL的查询压力,提高系统响应速度。例如,商品详情页数据在一段时间内变化不大,可以缓存起来,用户访问时直接从Redis获取,无需查询MySQL。
    • 数据结构灵活:不同的数据结构适用于不同的业务场景。例如,使用哈希(Hash)结构存储商品详情数据,方便根据商品ID快速获取商品的各个属性;使用有序集合(Sorted Set)存储热门商品列表,通过设置商品的热度分数来进行排序推荐。

数据读写流程

  1. 读流程
    • 商品详情查询
      1. 应用程序首先尝试从Redis中获取商品详情数据。根据商品ID作为键,在Redis中查找对应的哈希数据结构,其中哈希的字段为商品的各个属性(如名称、价格、描述等)。
      2. 如果Redis中存在该商品的缓存数据,则直接返回给应用程序,大大提高查询速度。
      3. 如果Redis中没有命中(即缓存未命中),则查询MySQL数据库。从商品表中根据商品ID获取商品的详细信息。
      4. 将从MySQL获取到的商品详情数据存入Redis中,设置合适的过期时间(例如根据商品的更新频率设置,一般热门商品可以设置较长的过期时间,普通商品设置相对较短的过期时间),以便后续查询能够命中缓存。然后将数据返回给应用程序。
    • 热门商品推荐
      1. 应用程序从Redis的有序集合(Sorted Set)中获取热门商品列表。有序集合的成员为商品ID,分数为商品的热度值(热度值可以根据商品的浏览量、销量等指标实时更新)。
      2. 根据获取到的商品ID列表,批量从Redis的哈希结构中获取商品的基本信息(如商品名称、图片链接等),直接返回给应用程序展示热门商品推荐。如果Redis中某些商品信息缺失(缓存未命中),则从MySQL中查询并补充到Redis中。
  2. 写流程
    • 商品数据更新
      1. 当商品信息发生变化(如价格调整、库存变动等)时,首先更新MySQL数据库中的商品表,确保数据的持久化和一致性。
      2. 然后删除Redis中对应的商品缓存数据(通过商品ID作为键删除哈希结构)。这样在下一次查询该商品时,会重新从MySQL获取最新数据并更新缓存,保证数据的实时性。
    • 热门商品热度更新
      1. 当商品的热度相关指标(如浏览量、销量)发生变化时,在MySQL中更新相应的记录(如在商品表中增加浏览量字段并更新值)。
      2. 同时在Redis的有序集合中更新该商品的热度分数。通过使用ZADD命令,将商品ID作为成员,新的热度值作为分数进行更新,以保证热门商品列表的实时性。

利用Redis特性提高查询性能

  1. 缓存机制:通过设置合理的缓存过期时间,将高频访问的数据缓存在Redis内存中,减少对MySQL的磁盘I/O操作,从而极大提高查询速度。对于更新频率低的商品数据,可以设置较长的过期时间;对于更新频繁的商品数据,设置较短的过期时间或采用其他策略(如数据变更时主动更新缓存)。
  2. 数据结构优化:根据不同业务场景选择合适的Redis数据结构。例如,使用哈希(Hash)结构存储商品详情数据,因为哈希结构具有高效的键值对存储和检索特性,适合存储对象类型的数据;使用有序集合(Sorted Set)存储热门商品列表,方便按照热度分数进行排序和范围查询,能够快速获取热门商品的排名和列表。
  3. 批量操作:Redis支持批量读取和写入操作,如MGET(批量获取多个键的值)和HMGET(批量获取哈希结构中多个字段的值)。在获取多个商品信息时,可以利用这些批量操作减少网络开销,进一步提高查询性能。同时,批量写入操作也可以提高数据更新的效率。
  4. 分布式缓存:在高并发、大规模的电商系统中,可以采用分布式缓存架构(如Redis Cluster),将缓存数据分布在多个节点上,提高缓存的存储容量和读写性能,并且具备一定的容错能力,即使部分节点出现故障,系统仍然可以正常运行。