之前的问题
在做反向计算时,主要涉及到区域数据的比较,通过查出所有子集再循环剔除,
数据量、大运算慢,频繁根据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,再对展开结果做排除即可完成层级运算
优势:
- 深拷贝只有层级key数组
- 层级运算不涉及数据库
- 返回结果只有展开的层级key,前端通过缓存cacheRegionKeyObj换算即可
总结
- 深拷贝处理可以尝试immutable
- 对于树形数据的层级计算,考虑转成平铺的形式,同时保留层级信息,需要将数据缓存在本地计算,适合数据量较小的场景