记录 对供货商财务报表的导出的优化


场景: 每个月跑完结算数据,生成各个供货商的结算报表数据
前置条件:一份离线报表的生成 受供货商订单的数量影响 ,时间在  5秒~30秒,尤其在购物节或者有推广活动时,时间还会增加
          一份报表的生成 需要包括 订单信息,结算数据,商品信息,发货信息。
 第一版:查询所有供货商 。循环生成报表,(无疑是有问题的)
 第二版:
       1.经过分析发现,其实每份报表的独立性是很高的,天生就适合多线程并发运行,我们把数据收集 和 报表生成分拆成两个步骤,我们采用了生产者消费者模式,首先将所有供应商生成报表任务放入一个队列有一组线程去处理,当完成收据收集后,加入到另外一个生成报表的队列 因为每个供货商报表数据收集完成的时间并一致,采用CompletionService作为线程池,先执行完的先返回,并不受加入顺序影响
       2.对于爆款商品 在供货商之间重复很高,为了避免重复性查询。肯定要使用缓存机制,无意Map是最适合的根据商品id拿到商品详情,考虑并发安全使用ConcurrentHashap,首先从缓存取,取不到再去查一次,
       3.由于一个订单包含多个商品,一个用户可以重复购买,最后使用三个个MAP,一个缓存商品,一个缓存订单,一个缓存用户
第三版:
       1.考虑到Map类型对内存的使用率低,一般只有20%-40%,ConcurrentHashap会更低,每次动辄几千商品信息放在map 要占用几百M的内存。为了限制Map的大小改用了ConcurrentLinkedHashMap,他本身是对ConcurrentHashap的封装,可以设定最大长度,并实现了基于LRU最少使用算法策略进行数据更新的缓存,对于冷门的商品在容量满了以后可以从缓存中去掉,提高内存利用率
       2.对线程池参数的调整

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值