选品筛选结果聚合减小内存占用实现思路
(1)why:随着选品接的需求越来越多,每一层标签条件请求ES获取到结果集在进行聚合时,有可能 结果集占用内存比较大,导致系统阻塞。
这样,在每一个结果集在进行逻辑运算时,压缩内存的占用就显的很有必要了。
(2) how to do: 二进制位运算概览:
(3)BitSet也既是位图的引入:
比如:两个复杂标签请求ES的结果返回两个List<wmPoiId>,把这个两个list映射到对应的位图上进行逻辑运算
(4)BitSet位图的优势:
一个1G的空间,有 8*1024*1024*1024=8.58*10^9bit,也就是可以表示85亿个不同的数 。
一个long类型的数字在Java中占用8个字节,一个字节8个bit,而在位图中只占用1个bit ,所以理论上可以节省64倍的字节
(5)位图聚合在选品中的落地分析:
位图适合于大数据量,非稀疏行的数据聚合。以我们的选品商家ID的筛选来说,线上wm_ad_poi_base_info表的最大商家ID为9382307,最小为1
现在假如一个结果集返回的数据是100万和long类型的List,占用的内存大概为:1000000*8/1024/1024=8M,而映射到位图以后占用字节为:9382307/8/1024/1024=1.19M