MST

星途 面试题库

面试题:复杂业务下基于Redis的MySQL批量数据处理并发控制设计

假设存在一个复杂的电商业务场景,涉及多个MySQL表的关联批量操作(如订单创建时涉及用户表、商品表、库存表等),同时需要保证高并发下的数据一致性。请设计一套基于Redis的并发控制方案,详细说明数据结构的选择、操作流程以及如何处理可能出现的异常情况。
27.8万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

数据结构选择

  1. 使用Redis的SET数据结构:用于存储当前正在处理订单的标识,以防止重复创建订单。例如,以订单号作为SET的成员。
  2. 使用Redis的HASH数据结构:记录商品库存等关键业务数据。以商品ID作为HASH的键,库存数量作为字段值。这样可以方便地进行原子性的库存增减操作。

操作流程

  1. 订单创建前
    • 首先,尝试将订单号添加到SET中,使用SADD命令。例如,SADD order_set {order_number}。如果返回值为1,表示添加成功,说明该订单尚未处理,可以继续后续操作;如果返回值为0,说明订单已在处理中,拒绝本次订单创建请求。
    • HASH中获取商品库存信息,使用HGET命令。例如,HGET product_stock {product_id},获取商品当前库存数量。
  2. 订单创建过程中
    • 使用HINCRBY命令原子性地减少商品库存。例如,HINCRBY product_stock {product_id} -1,减少一件商品库存。
    • 进行MySQL中涉及的多表关联操作,如插入订单数据到订单表,更新用户表相关信息(如积分等),同时要确保这些数据库操作在一个事务中。
  3. 订单创建成功后
    • SET中移除订单号,使用SREM命令。例如,SREM order_set {order_number},表示该订单已处理完成。

异常情况处理

  1. Redis操作异常
    • 如果SADD操作失败,可能是Redis服务暂时不可用,此时应记录错误日志,并进行重试。可以设置重试次数,如重试3次,如果仍然失败,返回给用户错误信息,告知系统繁忙,请稍后重试。
    • 如果HGETHINCRBY等操作失败,同样记录错误日志并进行重试。若重试失败,回滚MySQL中的事务操作,确保数据一致性。
  2. MySQL事务异常
    • 如果MySQL事务提交失败,回滚事务,并在Redis中恢复库存。例如,使用HINCRBY命令将之前减少的库存加回来,HINCRBY product_stock {product_id} 1。同时,从SET中移除订单号(如果已添加),以允许后续重试订单创建。
  3. 网络异常
    • 在操作过程中如果出现网络异常,无论是Redis还是MySQL操作,都应记录当前操作进度。例如,记录已经完成的Redis操作和MySQL事务执行到哪一步。当网络恢复后,根据记录的进度进行相应的补偿操作,要么重试未完成的操作,要么回滚已部分完成的操作,保证数据的一致性。