反向授权性能优化

之前的问题

在做反向计算时,主要涉及到区域数据的比较,通过查出所有子集再循环剔除,

数据量、大运算慢,频繁根据region_start_id查数据库,返回结果因为展开到商品,对反向涉及到的商品都会带上庞大的区域数据

插曲

深拷贝优化: 展开的授权数据,要从原始授权继承区域,需要深拷贝,直接深拷贝Object太慢,通过immutable做了优化,但涉及到的商品区域数据最后返回时要toJS,速度较慢

region缓存: region_start_id查数据库,将查询id数组长为1的做了lru,目的是缓存区域层级高、重复多的数据,在原始授权数据很多时有较大的速度提升

改造

根本问题

计算区域时,无法通过regionID直接知道层级,并做层级运算(会有子父级数据的剔除和补充)

实现方案

受树形数据加编号启发,通过一个层级key来表示regionID的层级信息,直接对key做运算

将原先展开循环的层级运算,变成字符串比较

缓存:

  • cacheRegionKeyObj key对应region记录
  • cacheRegionIdObj regionId对应key
  • cacheRegionKeysRank key对应子集keys,同层级数据groupby加列转行

在做层级运算时,通过字符串运算即可得到上下级key再到缓存里换出子集keys,再对展开结果做排除即可完成层级运算

优势:

  1. 深拷贝只有层级key数组
  2. 层级运算不涉及数据库
  3. 返回结果只有展开的层级key,前端通过缓存cacheRegionKeyObj换算即可

总结

  1. 深拷贝处理可以尝试immutable
  2. 对于树形数据的层级计算,考虑转成平铺的形式,同时保留层级信息,需要将数据缓存在本地计算,适合数据量较小的场景