对于实时话单而言,巨大的数据量和无规则的重发单导致如何对海量数据进行过滤成为一个难题,对于某大地市而言,一个月的话单量能达到50亿到60亿条话单。如果每条话单都去持久化数据库中查找,效率非常低下,如果存放在内存中,目前还没有生产主机的内存能容纳这么巨量的话单,即使存放的是比较短的话单id(保守估计每个id是80个字符组成的字符串,加上String类型的冗余属性可能达到100个字符),需要的总内存为8*100*50亿/8/1024/1024/1024=465G。
使用布隆过滤器把每条话单映射成BitSet的一个位,对于绝大部分非重复话单可以快速通过布隆过滤器判断出,对于极少的冲突部分和重复部分进行下一步进持久化数据的查询,影响较小。如何设计布隆过滤器和选择哈希算法成了解决问题的重点。下面是一些测试结果。
哈希算法:采用乘法哈希,对哈希结果值取绝对值,设置该值对应的bit位
哈希算法1:java自带的hashcode函数
哈希算法2:bernstein2
public static int bernstein2(String key)
{
int hash = 0;
int i;
for (i=0; i<key.length(); ++i)
hash = 33*hash + key.charAt(i);
return hash;
}
哈希算法3:bernstein3
public static int bernstein3(String key)