• 销量最优解


    微信公众号: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

  • 相关阅读:
    C#转义字符,以及@的作用
    建立数据库链接 create database link以及synonym
    Oracle11g密码区分大小写导致database link无法连接
    ES5:深入解析如何js定义类或对象。
    jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
    浅析JavaScript访问对象属性和方法及区别
    Angular ui-router的常用配置参数详解
    Angular 通过constant(name,value),value(name,value)创建服务
    Angular ocLazyLoad 与ui-router的配合使用
    AngularJs指令配置参数scope详解
  • 原文地址:https://www.cnblogs.com/molashaonian/p/16302258.html
Copyright © 2020-2023  润新知