给你的思考点赞哈~
如果你的连续值很大,需要构建数十万个Bitmap,这种方式当然是不可取的了。 所以我们要换一种设计方式。
比如,针对数值,我们可以分为个 十 百 千 万 ... 等,每位取值范围都是是0-9。
所以如果为每位构建bitmap则需要10个bitmap,那么一个亿需要90个bitmap则能存储。
比如,我们有一个用户的id为256,对id拆分后,在个位数为6、十位数为5、百位数为2的bitmap中都存储了该id。
当我们查找uid=256的用户的时候,则为bitmap(200) and bitmap(50) and bitmap(6)
当我们查找uid<256的用户的时候,则为百分位之上全部为0的用户 and 百分位小于2的所有用户 and 百分位等于2十分位小于5的所有用户 and 百分位等于2,十分位=5,个分位小于6的用户。
百分位之上全部为0的用户:bitmap(亿=0) and bitmap(千万=0) and bitmap(百万=0) and bitmap(十万=0) and bitmap(万=0) and bitmap(千=0)
百分位小于2的用户:bitmap(百=0) or bitmap(百=1)
百分位=2,十分位小于5的用户:bitmap(百=2) and (bitmap(十=0) or bitmap(十=1) or bitmap(十=2) or bitmap(十=3) or bitmap(十=4) )
百分位=2,十分位=5,个分为小于6的用户:bitmap(百=2) and bitmap(十=5) and (bitmap(个=0) or bitmap(个=1) or bitmap(个=2) or bitmap(个=3) or bitmap(个=4) or bitmap(个=5) or bitmap(个=6))
以上取and即可。
相比而言,这种方式bitmap变少了,但是整体的计算逻辑要比连续值模式复杂一些。 具体选择那种设计方式还是要根据数据的情况进行。