近期在查看系统代码的时候,发现用户标签部分的设计后续实现按标签筛选用户功能时可能会有效率问题。想起以前有关bitmap的一个思路,翻出来进行记录下,以备后面对系统进行改进。
1、建立标签字典
现有库中在标签列中存储的是标签名字,比如"付费用户,第二期用户",冗余较多,改进方案:简历标签字典,如:
id | tag_name |
---|---|
1 | 付费用户 |
2 | 第二期用户 |
... | ... |
简易解决方案,直接在标签字段中将标签名字替换成标签ID,获取数据后,在应用层进行标签ID到标签名字的映射,减少冗余。相对复杂的方案,将标签对应ID信息存储在一个int值中,采用位运算来获取用户是否含有对应标签。
2、为每个标签建立Bitmap,用于用户筛选
例如:
tag_id | bitmap |
---|---|
1 | 00000110(二进制,表示付费用户包含用户ID,1,2) |
2 | 00001010(二进制,表示付费用户包含用户ID,1,3) |
... | ... |
如果要获取既是付费用户又是第二期用户的用户ID则可以
00000110 & 00001010 = 00000010
由此可知用户ID为1的用户符合筛选条件。
总结:
改进思路1较为简单,具有马上实施的可能,思路2中尚有
一些问题需要解决。比如对于海量用户bitmap需要M级的空间进行存储,在这种情况下,进行用户筛选效率是否够高需要进一步验证.诸如此类问题,和具体实现方案,留待后续文章中进行解决....
Bitmap算法介绍
详见:https://blog.csdn.net/qq_31622605/article/details/78041796
参考: 《漫画算法:小灰的算法之旅》
网友评论