销量最优解

 

 

微信公众号:molashaonian

业务背景

商品列表等场景需要展示商品销量,销量自然就跟订单关联,那么统计销量就需要统计商品订单销售的sku 数量

痛点:目前销量计算以 spu(商品) 维度,通过JOB定时查询订单商品表进行统计,以及更新销量缓存,对数据库表的全量查询消耗过大

优化方案初版(优化大多不能一步到位,请看到最后)

  • 从计算入手。目前问题也知道了,全量查询计算消耗大,那就从计算销量入手。
  • spu首次全量计算销量,并记录该spu最后计算销量得到的订单ID
  • 存在spu最后计算的订单ID,根据该订单ID进行销量的增量计算
  • 新增全量计算开关控制,用以销量校准

该优化方案解决了多次的全量查询消耗过大问题,只会有初始的一次全量计算,之后便是增量,同时为了校准销量,也保留了全量计算的功能,通过开关控制。

  • 不足。虽然避免了全量计算,不过每次的Job都会对全部的 spu 进行销量计算,尽管有些 spu 在这期间并没有产生销售订单

优化方案升级版

为了解决初版无法避免对全部 spu 进行销量计算,在这一步决定把它干掉

  • 找出销量有变动的 spu。订单支付成功则记为有效销量,所以在支付回调处入手
  • 支付回调:对销量缓存进行更新,并对有销量新增的 spu 缓存起来
  • 保留初版优化的全量计算销量Job处理方案,用以销量校准 (该Job默认不打开)
  • 新增销量增量同步Job:从缓存中取销量数据(就是支付回调时存下的缓存数据)对数据库表,ES 同步
  • 结合实现逻辑图理解
支付回调 Redis销量缓存 Redis销量增量缓存 同步JOB MySQL/ES 校准JOB 更新 更新 获取并删除增量缓存 增量缓存销量更新至MySQL、ES 统计订单商品表进行销量校准 默认不开打 支付回调 Redis销量缓存 Redis销量增量缓存 同步JOB MySQL/ES 校准JOB

 

  • 对于销量解决方案欢迎留意评论

微信公众号:molashaonian
Alt

posted on 2022-05-23 18:03  EvanLong  阅读(61)  评论(0编辑  收藏  举报

导航